【问题标题】:what's the relationship between Monad and single threaded?Monad和单线程有什么关系?
【发布时间】: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 threadingdata 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 教程是一个很好的起点。

标签: haskell monads


【解决方案1】:

在 Haskell 中,[("ok", 0), ("no", 1)] 之类的东西不是数组*,而是列表。 Haskell 列表是不可变的,因此您甚至不必考虑更改它们。数组是另一回事。实际上有两种截然不同的东西,都称为数组:不可变数组和可变数组。

不可变数组只是某些类型的函数的替代表示形式以及有关其域的一些信息。

Wadler 正在讨论实际上可以更改的可变数组。我们实际上并不直接处理这些数组;相反,我们处理用作指向它们的指针的值。在 ML、Java、C 等语言中,您可以随时“跟随”指针来访问或修改它指向的值。但这会完全破坏 Haskell 的引用透明性,这对于理解和优化它都是至关重要的。

因此,我们要做的是将对数组的更改封装在抽象单子中。各种违反规则的事情都在幕后发生,但是暴露给你的程序员,保证是有意义的。在 GHC 中实际上有两个 monad 可以支持可变数组:IOST sST s 让您在纯函数中创建一个数组,以各种方式对其进行变异,然后产生纯结果。另一方面,IO 允许您将数组创建和修改与其他 IO 操作混合在一起。

* 在 GHC 中,它可能是一个数组,因为 GHC 提供了一个名为 OverloadedLists 的扩展,但即使在 GHC 中,它也不太可能是一个数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    • 2013-07-14
    • 2021-12-31
    • 1970-01-01
    • 2017-08-25
    • 2021-01-18
    相关资源
    最近更新 更多