2015-01-12 68 views
3

当我学习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) 

但这是没有帮助的,我听不懂以上总结。希望有一位热心人士多解释一下!

+3

我认为Wadler使用“单线程”的方式只与通常的含义有关。他在本文的早期将其定义为,“如果执行更新操作时没有其他指向现有阵列的指针”,则该操作是单线程的。所以诀窍是要显示在程序执行过程中任何给定点只有一个可用的数组引用。 –

+0

@ DanielWagner,谢谢!在重复阅读本文后,我也看到了这句话,并同意你的看法! – abelard2008

+1

“我想知道什么路径最适合理解Haskell的Monad”......首先,没有像“Haskell's Monad”这样的东西。 Monads是[数学概念](https://en.wikipedia.org/wiki/Monad_%28category_theory%29),其属性可以在各种Haskell类型中找到。然后我们调用这些类型_monads_并将它们作为Monad类型的一个实例。这里的所有都是它的。 - 关于“如何最好地理解单子”,你只需要编写大量的代码,并且用你认为可能工作的任何东西来欺骗。阅读一般的Haskell教程是一个很好的起点。 – leftaroundabout

回答

3

在Haskell,像[("ok", 0), ("no", 1)]数组*,而是列表。 Haskell列表是不可变的,所以你甚至不需要考虑它们的变化。阵列是另一回事。实际上有两种非常不同的东西,都称为数组:不可变数组和可变数组。

不可变阵列只是某些类型的函数的替代表示以及关于它们的域的一些信息。

Wadler正在讨论可变数组,它实际上可以改变。我们实际上并不直接处理这些数组;相反,我们处理的价值观可以作为指标。在ML,Java,C等语言中,只要您有指针访问或修改指向的值,就可以“跟随”指针。但是这会彻底打破Haskell的参照透明性,这对理解和优化它是至关重要的。

因此,我们所做的是将抽象单元中的数组封装到一个数组中。各种各样的事情都在破坏规则的情况下进行,但程序员暴露给你的是保证有意义。实际上有两个monad可以支持GHC中的可变阵列:IOST sST s可以让你在一个纯函数中创建一个数组,通过各种方式进行变异,然后产生一个纯粹的结果。另一方面,IO可让您将阵列创建和修改与其他IO操作混合在一起。

*在GHC,它可能是一个数组,因为GHC提供了一个名为OverloadedLists的延伸,但即使在GHC这是非常不可能是一个数组。

相关问题