gpt4 book ai didi

haskell - 使用 ContT 构造函数创建新的 Monad Cont

转载 作者:行者123 更新时间:2023-12-01 07:55:28 25 4
gpt4 key购买 nike

我开始阅读The Mother of All Monads ,并输入这个例子:

import Control.Monad.Cont

ex1 = do
a <- return 1
b <- return 10
return $ a+b

但是我得到了一个编译时错误:
ghci> :l ContMonad.hs 
[1 of 1] Compiling Main ( ContMonad.hs, interpreted )

ContMonad.hs:4:4:
No instance for (Monad m0) arising from a do statement
The type variable ‘m0’ is ambiguous
Relevant bindings include
ex1 :: m0 Integer (bound at ContMonad.hs:3:1)
Note: there are several potential instances:
instance Monad ((->) r) -- Defined in ‘GHC.Base’
instance Monad IO -- Defined in ‘GHC.Base’
instance Monad [] -- Defined in ‘GHC.Base’
...plus six others
In a stmt of a 'do' block: a <- return 1
In the expression:
do { a <- return 1;
b <- return 10;
return $ a + b }
In an equation for ‘ex1’:
ex1
= do { a <- return 1;
b <- return 10;
return $ a + b }
Failed, modules loaded: none.

我怎样才能得到这个简单的例子来进行类型检查?

最佳答案

问题是ex1因为表达式适用于任何 monad,并且未指定使用的 monad。 ex1的类型很可能是 ex1 :: (Num b, Monad m) => m b但是,因为dreaded monomorphism restriction , GHC 无法推断出这种多态类型,因此结果不明确。

您可以通过给它一个显式类型签名或禁用单态限制来编译它:

{-# LANGUAGE NoMonomorphismRestriction #-}

当你在 GHCi 中使用它时,它会自动默认值 ex1IO Int因为 extended default rules :
*Main> ex1
11

这些规则的存在是为了使 ghci 可用作计算器并提示进行 IO 操作。

您还应该与其他一些 monad 一起尝试,看看会发生什么:
*Main> ex1 :: [Int]
[11]
*Main> ex1 :: Maybe Int
Just 11

关于haskell - 使用 ContT 构造函数创建新的 Monad Cont,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28934042/

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