joh*_*ual 5 random signals elm
我试图让一列随机数每秒都在变化,但我得到不同的错误信息:
import Random
main = flow down
[ asText (Random.range 0 100 (every second))
, asText (Random.range 0 100 (every second))
]
Run Code Online (Sandbox Code Playgroud)
给出一个解析错误.我的方括号有[
什么问题?
Parse error at (line 5, column 1):
unexpected '['
expecting newline, spaces or end of input
Run Code Online (Sandbox Code Playgroud)
一旦我缩进,该示例确实编译但我只是得到<signal>
而不是实际的数字
main = flow down
[ asText (Random.range 0 100 (every second))
, asText (Random.range 0 100 (every second))
]
Run Code Online (Sandbox Code Playgroud)
lift
对于信号?最后,当我尝试使用lift
它时,给了我其他的困惑
main = flow down
[ lift asText (Random.range 0 100 (every second))
, lift asText (Random.range 0 100 (every second))
]
Run Code Online (Sandbox Code Playgroud)
错误消息是我的类型错误lift
.
Type error on line 5, column 5 to 9:
lift
Expected Type: Signal Element
Actual Type: Element
Run Code Online (Sandbox Code Playgroud)
flow down
只是一个清单如果我忘记了流量,它仍然不合作:
main = lift asText
[ (Random.range 0 100 (every second))
, (Random.range 0 100 (every second))
]
Run Code Online (Sandbox Code Playgroud)
我收到了_List
预期的错误消息:
Type error between lines 5 and 7:
[Random.range 0 100 (every second),
Random.range 0 100 (every second)]
Expected Type: _List
Actual Type: Signal
Run Code Online (Sandbox Code Playgroud)
我使用Random.range
得当吗?我没有从原来的例子中改变它:
我如何得到它与cooprate lift
和flow down
?
这是一个适用于0.15 [EDIT:和0.16]的答案,目前是Elm的最新版本.由于写了Joe的答案,因此对Random库进行了大修,以使用纯随机数生成器.伪随机数是确定性的:每次运行总是相同的,除非您更改初始种子.
我们从导入开始:无聊但必要,然后使用随机库定义一些常量.
import Graphics.Element exposing (flow, down, show, Element)
import Time exposing (fps)
import Random
gen = Random.int 0 100
gen2 = Random.pair gen gen
seed0 = Random.initialSeed 42
Run Code Online (Sandbox Code Playgroud)
接下来,我们定义一个状态类型,包含随机种子和要显示的数字.我以为我们想要两个; 对于常量长度列表,请使用Random.list n gen
.我们还使用记录构造函数语法(以及两个"随机"数字)定义初始状态.
type alias State = {seed : Random.Seed, first : Int, second : Int}
state0 = State seed0 36 89
Run Code Online (Sandbox Code Playgroud)
现在我们定义一个每秒运行一次的步骤函数.在这里,我们剥离两个随机数并将它们与新种子一起存储.请注意,我们每次都使用一个新的种子,一个链接到另一个.
step : a -> State -> State
step _ state =
let
((first, second), seed') = Random.generate gen2 state.seed
in
State seed' first second
Run Code Online (Sandbox Code Playgroud)
现在我们foldp
用来介绍状态,实际运行那个步骤函数.
state : Signal State
state = Signal.foldp step state0 (fps 1)
Run Code Online (Sandbox Code Playgroud)
我们定义一个纯渲染函数.这里没有信号.
render : State -> Element
render state =
flow down [show state.first, show state.second]
Run Code Online (Sandbox Code Playgroud)
最后我们将渲染函数映射(以前提升)到状态.
main = Signal.map render state
Run Code Online (Sandbox Code Playgroud)
如果您连接灰色框并删除插页式注释,您将获得一个有效的Elm 0.15程序.但请注意,它似乎是CPU密集型的.
这里发生了一些事情:
正如您所期望的,在第一部分中,您遇到了编译器不喜欢的缩进问题。
下一个示例之所以有效,是因为列表中的两件事实际上是信号。但是,这不是你想要的。相反,您想要打印出符号。
这是一个简单的举升示例Random.range
:
import Random
main = asText <~ (Random.range 0 10 (every second))
Run Code Online (Sandbox Code Playgroud)
这将每秒显示一个 0 到 1 之间的值。这与工作方式有关lift
。它的类型是(a -> b) -> Signal a -> Signal b
. 每当第二个参数的信号发生变化时,它都会使用该值运行指定的函数。
因此,您正在尝试的第三件事的编译错误是抱怨该函数flow
期望您的列表的内容是Element
,但实际上是Signal Element
。
你在那里的最后一件事不起作用,因为lift
期望 aSignal
作为它的第二个参数,但你给了它 a [Signal]
。
你真的想要这样的东西:
import Random
main = lift2 randomcolumn (Random.range 0 100 (every second)) (Random.range 0 100 (every second))
randomcolumn x y = flow down [asText x,
asText y]
Run Code Online (Sandbox Code Playgroud)
http://share-elm.com/sprout/53d28d73e4b07afa6f983534
希望这可以帮助!