【发布时间】:2022-11-11 12:37:47
【问题描述】:
我无法理解如何从其definition 派生列表单子的迭代行为。
instance Monad [] where
m >>= f = concatMap f m
return x = [x]
fail s = []
我读过的讨论似乎忽略了>>= 如何创建控制结构的问题,如do 符号最清楚地显示:
allEvenOdds :: Int -> [(Int,Int)]
allEvenOdds n = do
evenValue <- [2,4 .. n]
oddValue <- [1,3 .. n]
return (evenValue,oddValue)
这是内置在 Haskell 中的吗,我假设 IO monad 与实际 i/o 的接口的方式是?
【问题讨论】:
-
do符号是去糖的,所以它被转换为[2,4 .. n] >>= \evenValue -> [1, 3 .. n] >>= \oddValue -> return (evenValue, oddValue),并且根据 monad 类型,它会导致不同的语义。因此它不是“硬连线”到IO。 -
简而言之,
IO基本上是State的半魔法特化。魔法 (IIUC) 的主要来源是,即使runIO存在,也没有您可以提供的 Haskell 术语作为初始状态。粗略地说,您定义了一个名为main的IO操作,运行时会为您执行类似runIO main MagicStateOfTheWorld的操作。