当我学习Monod时,我想知道什么路径最适合理解Haskell的Monad。许多人如Bartosz Milewski提出Monads for functional programming是最好的材料。在阅读本文的一部分后,我得到了同样的感受,但在4.2 Array transforms
中,我不知道如何理解关于Monad的总结,因为我错过了第16页底部的一些基础:Monad和单线程之间有什么关系?
“使M成为抽象数据类型保证单个线程保留 ,因此使用就地更新来实现赋值是安全的 数据抽象的使用对于此目的是必不可少的,否则,可以编写诸如(\x -> (assign i v x ; assign i w x))
这样的程序,这些程序违反单线程属性“。
我不知道为什么Philip Wadler在这里讨论single threading
?为什么?为了保证单线程,data M a = State -> (a, State)
必须非常重要。
对于我实现了这部分4.2 Array transforms
,在这里我认为我的数组类似于Arr [("ok", 0), ("no", 1)]
的代码,index
是字符串,值是Int
:
type M a = State -> (a, State)
data Arr = Arr [(Id, Val)] deriving (Show)
type State = Arr
type Id = String
type Val = Int
type Ix = Id
update ix val arr = updateNew ix val arr (Arr [])
where updateNew ix val (Arr (x:xs)) (Arr newArr) =
case (fst x) == ix of
True -> Arr (newArr ++ ((ix,val):xs))
False -> updateNew ix val (Arr xs) (Arr (newArr ++ [x]))
assign :: Ix -> Val -> M()
assign i v = \x -> ((), update i v x)
但这是没有帮助的,我听不懂以上总结。希望有一位热心人士多解释一下!
我认为Wadler使用“单线程”的方式只与通常的含义有关。他在本文的早期将其定义为,“如果执行更新操作时没有其他指向现有阵列的指针”,则该操作是单线程的。所以诀窍是要显示在程序执行过程中任何给定点只有一个可用的数组引用。 –
@ DanielWagner,谢谢!在重复阅读本文后,我也看到了这句话,并同意你的看法! – abelard2008
“我想知道什么路径最适合理解Haskell的Monad”......首先,没有像“Haskell's Monad”这样的东西。 Monads是[数学概念](https://en.wikipedia.org/wiki/Monad_%28category_theory%29),其属性可以在各种Haskell类型中找到。然后我们调用这些类型_monads_并将它们作为Monad类型的一个实例。这里的所有都是它的。 - 关于“如何最好地理解单子”,你只需要编写大量的代码,并且用你认为可能工作的任何东西来欺骗。阅读一般的Haskell教程是一个很好的起点。 – leftaroundabout