首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >榆树回忆录

榆树回忆录
EN

Stack Overflow用户
提问于 2016-09-11 22:35:49
回答 1查看 743关注 0票数 2

我试图用Elm编写一个伪随机生成器(在屏幕上生成点),但并不容易,因为它干扰了Elm编译器的纯度。

好吧,那为什么不写我们自己的函数呢?如果我们写了这样的东西,我们就可以得到某种随机行为:

代码语言:javascript
复制
-- initial state
randomNumbers = [ 1 ]
x = 1
b = 2
n = 2017

-- generate random numbers
x = (x*b) % n
randomNumbers = x :: randomNumbers

这不符合Elm的可变赋值规则。有些地方不对劲。

我所做的就是找到2017年的2 mod的力量。前几个很简单,但是顺序却是不可预测的。所以我需要跟踪计算的最后一个数字。

代码语言:javascript
复制
[ 1,  2,  4, 8, ... , 1024, 31, 62, 124, ...]

即使我尝试使用算术的特殊属性,我仍然需要计算这个稀疏的幂列表。

代码语言:javascript
复制
[ 1, 2^1, 2^2, 2^4, 2^8, 2^16, ... ]

我可以通过逐次平方来解决问题,但我仍然需要一些方法来记住最后一步。

我以为..。只要我自己编写代码,我就不必从“真实世界”中导入随机性来生成我的公平数字。这样才能尊重榆树的纯净。然而,我最后写的东西是有状态的

Random库中,Elm现在确实有一个随机数生成器(一些算法的实现),返回一个generator类型。

这一次会议很有启发性:

代码语言:javascript
复制
> 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来记住一些事情,我就可以用一行来生成我的所有值:

代码语言:javascript
复制
List.map f [1..100]
EN

回答 1

Stack Overflow用户

发布于 2016-09-11 23:48:13

两名候选人:

A

https://github.com/elm-community/list-extra/blob/3.1.0/src/List/Extra.elm

代码语言:javascript
复制
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

代码语言:javascript
复制
{-| 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))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39441304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档