Как я могу использовать функцию карты со случайным числом
Этот код взят из http://elm-lang.org/edit/examples/Intermediate/Stamps.elm. Я сделал небольшое изменение, см. Ниже.
import Mouse
import Window
import Random
main : Signal Element
main = lift2 scene Window.dimensions clickLocations
-- for a good time, remove "sampleOn Mouse.clicks" ;)
clickLocations : Signal [(Int,Int)]
clickLocations = foldp (::) [] (sampleOn Mouse.clicks Mouse.position)
scene : (Int,Int) -> [(Int,Int)] -> Element
scene (w,h) locs =
let p = Random.float (fps 25)
drawPentagon p (x,y) =
ngon 5 20 |> filled (hsla p 0.9 0.6 0.7)
|> move (toFloat x - toFloat w / 2, toFloat h / 2 - toFloat y)
|> rotate (toFloat x)
in layers [ collage w h (map (drawPentagon <~ p) locs) // I want to change different color each time, error here!
, plainText "Click to stamp a pentagon." ]
Как я могу передать сигнал при использовании функции карты?
1 ответ
Решение
В вашем коде у вас есть drawPentagon <~ p
который имеет тип Signal ((Int, Int) -> Form)
Тип карты map : (a -> b) -> [a] -> [b]
который вызывает ошибку типа. Это в основном говорит, что map
ожидает функцию a -> b
но вы дали ему Signal ((Int, Int) -> From)
,
Один из способов попытаться сделать то, что вы делаете, это сделать p
параметр scene
и использовать lift3
пройти в Random.float (fps 25)
, Итак, вы бы в конечном итоге с этим:
import Mouse
import Window
import Random
main : Signal Element
main = lift3 scene Window.dimensions clickLocations (Random.float (fps 25))
-- for a good time, remove "sampleOn Mouse.clicks" ;)
clickLocations : Signal [(Int,Int)]
clickLocations = foldp (::) [] (sampleOn Mouse.clicks Mouse.position)
scene : (Int,Int) -> [(Int,Int)] -> Float -> Element
scene (w,h) locs p =
let drawPentagon p (x,y) =
ngon 5 20 |> filled (hsla p 0.9 0.6 0.7)
|> move (toFloat x - toFloat w / 2, toFloat h / 2 - toFloat y)
|> rotate (toFloat x)
in layers [ collage w h (map (drawPentagon p) locs)
, plainText "Click to stamp a pentagon." ]
Это то, что вы пытались сделать?