Haskell闭包报错‘No instance for (Integral (IO t0))’原因及修复
问题分析与修复
错误原因
你遇到的类型错误核心在于main函数的do块特性:Haskell中do块内的每一条语句都必须是IO类型的动作,但genIfEven 3 testfunc1执行后返回的是一个普通数值(这里因为3是奇数,直接返回3),不属于IO类型。编译器尝试将这个普通数值强制转换为IO类型,就抛出了No instance for (Integral (IO t0))的错误。
修复代码
只需要将计算结果用print函数包装成IO动作,就能满足do块的要求:
ifEven func x = if even x then func x else x genIfEven x = (\func -> ifEven func x) testfunc1 :: Num a => a -> a testfunc1 x = x+2 main = do print $ genIfEven 3 testfunc1
补充说明
genIfEven的实际类型是Integral a => a -> (a -> a) -> a:因为even函数要求参数是Integral类型,所以x必须属于Integral类;func是接收同类型参数并返回同类型结果的函数,最终返回的也是该类型的值。testfunc1的类型Num a => a -> a可以兼容genIfEven的要求,因为Integral是Num的子类,类型会自动统一为Integral a。- 如果测试偶数,比如
genIfEven 4 testfunc1,会返回6(4是偶数,执行testfunc1 4得到6),用print也能正常输出。
内容的提问来源于stack exchange,提问作者Anon Anon
相关产品推荐
相关产品推荐

