我试图用Elm编写一个伪随机生成器(在屏幕上生成点),但并不容易,因为它干扰了Elm编译器的纯度。
好吧,那为什么不写我们自己的函数呢?如果我们写了这样的东西,我们就可以得到某种随机行为:
-- initial state
randomNumbers = [ 1 ]
x = 1
b = 2
n = 2017
-- generate random numbers
x = (x*b) % n
randomNumbers = x :: randomNumbers这不符合Elm的可变赋值规则。有些地方不对劲。
我所做的就是找到2017年的2 mod的力量。前几个很简单,但是顺序却是不可预测的。所以我需要跟踪计算的最后一个数字。
[ 1, 2, 4, 8, ... , 1024, 31, 62, 124, ...]即使我尝试使用算术的特殊属性,我仍然需要计算这个稀疏的幂列表。
[ 1, 2^1, 2^2, 2^4, 2^8, 2^16, ... ]我可以通过逐次平方来解决问题,但我仍然需要一些方法来记住最后一步。
我以为..。只要我自己编写代码,我就不必从“真实世界”中导入随机性来生成我的公平数字。这样才能尊重榆树的纯净。然而,我最后写的东西是有状态的。
在Random库中,Elm现在确实有一个随机数生成器(一些算法的实现),返回一个generator类型。
这一次会议很有启发性:
> import Random exposing (..)
>
> initialSeed 0
Seed {
state = State 1 1 ,
next = <function>,
split = <function>,
range = <function>
}
: Random.Seed
> seed0 = initialSeed 101
Seed {
state = State 102 1, ,
next = <function>,
split = <function>,
range = <function>
}
: Random.Seed
> step ( int 0 10 ) seed0
(10,Seed { state = State 4081428 40692, ,
next = <function>,
split = <function>,
range = <function>
}
: ( Int, Random.Seed )即使用我简化的婴儿随机数发生器,这里有什么是有状态的?
如果我说的是回忆录,我指的是dynamic programming,还是反过来说的话,我会提前道歉。
如果我能够编写一个有状态函数f来记住一些事情,我就可以用一行来生成我的所有值:
List.map f [1..100]发布于 2016-09-11 23:48:13
两名候选人:
A
https://github.com/elm-community/list-extra/blob/3.1.0/src/List/Extra.elm
iterate : (a -> Maybe a) -> a -> List a
iterate f x =
case f x of
Just x' -> x :: iterate f x'
Nothing -> [x]B
https://github.com/elm-community/elm-lazy-list/blob/1.3.0/src/Lazy/List.elm
{-| Create an infinite list of applications of a function on some value.
Equivalent to:
x ::: f x ::: f (f x) ::: f (f (f x)) ::: ... -- etc...
-}
iterate : (a -> a) -> a -> LazyList a
iterate f a =
lazy <|
\() ->
Cons a (iterate f (f a))https://stackoverflow.com/questions/39441304
复制相似问题