gpt4 book ai didi

haskell - Haskell中do-notation中变量的类型是什么?

转载 作者:行者123 更新时间:2023-12-03 23:21:43 33 4
gpt4 key购买 nike

下面的代码看起来很清楚:

do 
x <- Just 3
y <- Just "!"
Just (show x ++ y)

这里是 x 的类型是 NumyString . ( <- 这里用于从 Monad 中取出实际值)

但是,这个片段对我来说似乎不太清楚:
import Control.Monad.Instances
addStuff :: Int -> Int
addStuff = do
a <- (* 2)
b <- (+ 10)
return (a + b)
a的类型是什么和 b 的类型这里?看起来他们的行为就像 Num , 但是 a <- (* 2)b <- (+ 10)这里看起来很神秘……

有人对此有想法吗?

最佳答案

好吧,你偶然发现了一种奇怪的单子(monad)。

有问题的单子(monad)是 Monad ((->) r) .这是什么意思?嗯,它是 r -> * 形式的函数单子(monad)。 .即,采用相同类型输入的函数。

您问 a 的类型是什么?和 b在这种情况下。嗯,他们都是Num a => a ,但这并不能解释太多。

直观上,我们可以这样理解 monad: monadic value 是一个函数,它接受一个类型为 r 的值。作为输入。每当我们在 monad 中绑定(bind)时,我们都会获取该值并将其传递给绑定(bind)函数。

即,在我们的 addStuff例如,如果我们调用 addStuff 5 ,然后 a绑定(bind)到 (*2) 5 (即 10 )和 b绑定(bind)到 (+10) 5 (即 15 )。

让我们从这个 monad 中看一个更简单的例子来尝试理解它是如何精确地工作的:

mutate = do a <- (*2)
return (a + 5)

如果我们将其脱糖为绑定(bind),我们会得到:
mutate = (*2) >>= (\a -> return (a + 5))

现在,这并没有多大帮助,所以让我们使用 the definition of bind对于这个单子(monad):
mutate = \ r -> (\a -> return (a + 5)) ((*2) r) r

这减少到
mutate = \ r -> return ((r*2) + 5) r

我们使用 return 的定义是 const , 可以减少到
mutate = \ r -> (r*2) + 5

这是一个函数,它将一个数字乘以 2,然后加 5。

这是一个奇怪的单子(monad)。

关于haskell - Haskell中do-notation中变量的类型是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30694178/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com