在我的机器上,以下代码打印:
$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 7.6.3
$ runhaskell Why.hs
[1,1,1]
[2,2,2]但是在FP完成时,它会产生一个错误:(除非我切换到GHC 7.8 Preview,LPaste用于克隆http://lpaste.net/108096)
src/Main.hs@4:7-4:13No instance for (Monad ((->) (IO Int)))
arising from a use of `return'
Possible fix:
add an instance declaration for (Monad ((->) (IO Int)))
In the expression: return 3
In an equation for `num': num = return 3这是密码。我试图创建一个重复IO操作的函数,时间为IO Int操作。我注意到GHC为num导出了一个奇怪的类型签名。
import Control.Monad
-- Notice the weird type signature, for - it seems - no reason
num :: IO Int -> Int
num = return 3
rep :: IO Int -> IO [Int]
rep = num >>= replicateM
rep' :: IO Int -> IO [Int]
rep' = do x <- num
replicateM x
main :: IO ()
main = do print =<< rep (return 1)
print =<< rep' (return 2)发布于 2014-07-25 10:08:54
return 3 :: IO Int -> Int与IO没有任何关系。事实上,你可以写
num :: a -> Int
num = return 3同样的事。return在这里使用(a -> ) monad,其定义是return = const。所以你写得很有效
num _ = 3IO的动作就被扔掉了。
现在,关于它为什么不能在FP上工作:自ghc-7.6以来,Monad (a -> )实例只包含在前奏中:
GHCi,版本7.6.2:http://www.haskell.org/ghc/ :?寻求帮助 装载包装ghc-prim .连接..。好了。 装载包装整数-gmp.连接..。好了。 装载包裹基地..。连接..。好了。 Prelude> :i Monad Monad m级 (>>=) ::m a -> (a -> m b) -> m b (>>) ::m a -> m b -> m b b 返回::a -> m a 失败::字符串-> m 在
GHC.Base' instance Monad Maybe -- Defined inData.Maybe中定义 实例Monad ( e) --在Data.Either' instance Monad [] -- Defined inGHC.Base中定义 实例Monad -在GHC.Base' **instance Monad ((->) r) -- Defined inGHC.Base'**中定义 Prelude>
鉴于
GHCi,版本7.4.1:http://www.haskell.org/ghc/ :?寻求帮助 装载包装ghc-prim .连接..。好了。 装载包装整数-gmp.连接..。好了。 装载包裹基地..。连接.:完成。 Prelude> :i Monad Monad m级 (>>=) ::m a -> (a -> m b) -> m b (>>) ::m a -> m b -> m b b 返回::a -> m a 失败::字符串-> m 在
GHC.Base' instance Monad Maybe -- Defined inData.Maybe中定义 实例Monad [] --在GHC.Base' instance Monad IO -- Defined inGHC.Base中定义 Prelude>
要在旧版本中获取此实例,需要使用import Control.Monad.Instances。
我觉得这不是你真正想要的。我不知道你所说的“重复IO行动乘以IO Int行动”是什么意思,但我想这有点像
IO a -> IO Int -> IO [a]如果是这样,那就从这个签名开始。不要让GHC推断顶级类型,这绕过了类型系统提供的bug保护。
https://stackoverflow.com/questions/24952679
复制相似问题