【问题标题】:memoization in ElmElm 中的记忆
【发布时间】:2016-09-11 22:35:49
【问题描述】:

我正在尝试在 Elm 中编写一个伪随机生成器(在屏幕上生成点),但并不那么容易,因为它会干扰 Elm 编译器的“纯度”。

好的,那为什么不写我们自己的函数呢?如果我们编写如下内容,我们可以获得某种随机行为:

-- initial state
randomNumbers = [ 1 ]
x = 1
b = 2
n = 2017

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

这不符合 Elm 的变量赋值规则。出了点问题。

我所做的只是寻找 2 mod 2017 的力量。前几个很容易,但随后的顺序变得不可预测。所以我需要跟踪计算的最后一个数字。

[ 1,  2,  4, 8, ... , 1024, 31, 62, 124, ...]

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

[ 1, 2^1, 2^2, 2^4, 2^8, 2^16, ... ]

我可以通过successive squaring解决吗,但我仍然需要一些方法来记住最后一步。


我想……只要我编写自己的代码,我就不必从“现实世界”中导入随机性来生成我的公平数字。这种方式尊重榆树的纯净。然而,我最终写了一些有状态的东西。

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

这个 repl 会话很有启发性:

> 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 )

即使使用我简化的婴儿随机数生成器,这里还有什么状态?


如果我说 memoizaton 而我的意思是 动态编程 或其他方式,我提前道歉

What is the difference between memoization and dynamic programming?

如果我可以编写一个有状态的函数f 来记住事情,我可以只用一行来生成我所有的值:

List.map f [1..100]

【问题讨论】:

标签: dynamic-programming memoization elm


【解决方案1】:

两名候选人:

一个

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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 2020-10-25
    • 2012-01-03
    • 2012-09-14
    • 2011-03-13
    • 1970-01-01
    相关资源
    最近更新 更多