gpt4 book ai didi

Haskell:之前的返回被之后的单子(monad)取消。如何?

转载 作者:行者123 更新时间:2023-12-04 18:11:18 26 4
gpt4 key购买 nike

如何理解 return 1 getLine 声明?它通过了类型检查,看起来与 1 相同. getLine怎么样和 return互相“取消”?这对我来说根本没有意义。

Prelude> :t return 1
return 1 :: (Monad m, Num a) => m a

Prelude> :t return 1 getLine -- why is it not a type error?
return 1 getLine :: Num t => t

Prelude> return 1 getLine
1 -- whatever happened to getLine?
此外,即使涉及 getLine,最终产品为什么是“纯”的? ?

最佳答案

如果你写 return 1 getLine ,这意味着 return 1应该是一个接受 getLine 的函数作为参数。
我们很幸运,因为有一个 instance for Monad with a function ((->) r) [src] .的确:

-- | @since 2.01
instance Applicative ((->) r) where
pure = const
(<*>) f g x = f x (g x)
liftA2 q f g x = q (f x) (g x)

-- | @since 2.01
instance Monad ((->) r) where
f >>= k = \ r -> k (f r) r
(->) rr -> … 的更规范的形式.因此它是 r 的函数作为参数类型,如果应用于类型参数 a例如,那么 ((->) r) a相当于 r -> a .
对于 Monad 的这个实例, returnpure 具有相同的实现这是 const .因此,这意味着:
return 1 getLine
相当于:
   const 1 getLine
→ (\_ -> 1) getLine
→ 1

关于Haskell:之前的返回被之后的单子(monad)取消。如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69325169/

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