我正在学习Haskell中的monad,我理解为什么它们很有用,我一般都理解bind,join,return do.
我还查看了基本读者/编写器/状态/列表/可能是monad的基本用法示例.
尽管如此,作为一名初学者,我仍然不觉得我对"运行"功能(例如runState,runReader,runWriter)的含义有所了解.它似乎没有像上面这些函数一样的通用签名,如果它可以定义/对所有monad都有意义,我就不会得到它.
我是Haskell和函数式编程的新手,我想知道为什么这样的例子("嵌套循环")有效:
do
a <- [1, 2, 3]
b <- [4, 5, 6]
return $ a * 10 + b
Run Code Online (Sandbox Code Playgroud)
下面的一些东西是一种伪Haskell语法,但我希望它能说明我的理解.
这是我的理解,它变成了这样的东西
[1, 2, 3] >>= \a ->
([4, 5, 6] >>= \b ->
return $ b * 10 + a)
Run Code Online (Sandbox Code Playgroud)
我想这个表达方式
[4, 5, 6] >>= \b -> return $ b * 10 + a
Run Code Online (Sandbox Code Playgroud)
生成部分应用函数的列表
[[40 + a], [50 + a], [60 + a]]
Run Code Online (Sandbox Code Playgroud)
连接到
[40 + a, 50 + a, 60 + a]
Run Code Online (Sandbox Code Playgroud)
最后一步,看起来像这样
[1, 2, 3] >>= \a …
Run Code Online (Sandbox Code Playgroud) 我想知道什么样的Haskell类型声明与下面的类型方案匹配?
?a,bH(a?b)?b
这是从4.1明确性/重载理论
稍后,请在chi的答案后进行编辑。我尝试了这段代码,但我不能让它失败
class H f where
g :: f -> Bool
instance H (Integer -> Bool) where
g f = f 0
instance H (Char -> Bool) where
g f = f '1'
g (\x -> if x > 10 then True else False)
g (\x -> if x == '0' then True else False)
Run Code Online (Sandbox Code Playgroud)
另外,我意识到对于此代码,通过添加功能| b -> a
匹配(如匹配此传播规则)无法使类型明确
(FH) H (a —> b),H (a' —> b) => a = a'