【发布时间】:2015-01-12 00:11:07
【问题描述】:
当我学习 Monod 时,我想知道哪条路径最适合理解 Haskell 的 Monad。 Bartosz Milewski等很多人提出Monads for functional programming是最好的素材。在阅读了这篇论文的一部分后,我有同样的感觉,但是在4.2 Array transforms,我不知道如何理解关于 Monad 的摘要,因为我错过了第 16 页底部的一些基础:
“将 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,谢谢!重复读完这篇论文,我也看到了这句话,同意你的看法!
-
“我想知道什么路径最适合理解 Haskell's Monad”……首先,没有“Haskell's Monad”这样的东西。 Monad 是 a mathematical concept,其属性可以在各种 Haskell 类型中找到。然后我们将这些类型称为 monads 并使它们成为
Monad类型类的实例。这里的所有都是它的。 — 关于“如何最好地理解 monad”,您只需要编写大量代码,然后随便玩弄您认为可行的任何东西。阅读一般的 Haskell 教程是一个很好的起点。