首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >组合IO操作时的怪异类型签名

组合IO操作时的怪异类型签名
EN

Stack Overflow用户
提问于 2014-07-25 09:42:57
回答 1查看 87关注 0票数 1

在我的机器上,以下代码打印:

代码语言:javascript
复制
 $ 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)

代码语言:javascript
复制
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导出了一个奇怪的类型签名。

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-25 10:08:54

return 3 :: IO Int -> Int与IO没有任何关系。事实上,你可以写

代码语言:javascript
复制
num :: a -> Int
num = return 3

同样的事。return在这里使用(a -> ) monad,其定义是return = const。所以你写得很有效

代码语言:javascript
复制
num _ = 3

IO的动作就被扔掉了。

现在,关于它为什么不能在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行动”是什么意思,但我想这有点像

代码语言:javascript
复制
IO a -> IO Int -> IO [a]

如果是这样,那就从这个签名开始。不要让GHC推断顶级类型,这绕过了类型系统提供的bug保护。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24952679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档