【发布时间】:2019-10-13 15:55:15
【问题描述】:
调用以下命令时,GHCI 会返回错误: 由于使用“print”而产生的模棱两可的类型变量“f0”、“b0”会阻止解决约束“(Show (f0 b0))”。
据我了解,这是因为我的表达式的类型是 (Num b, Functor f) => [f b] 其中 f 是模棱两可的类型。
但是List的Functor实例将fmap定义为map,map的定义忽略了函数参数,如果第二个参数是[]简单地返回[]。这应该意味着无论我应用了多少 fmap 组合,我的表达式都应该简单地返回 [],并且应该通过调用 show []。那为什么我会看到错误呢?
(fmap.fmap) (+1) []
【问题讨论】:
-
因为为了渲染它一个列表,类型约束是它应该渲染元素。实例为
instance Show a => Show [a]。 -
谢谢,有道理。这是否意味着如果我要编写一个函数 functorExample :: [[Int]] -> [[Int]],其中 functorExample = (fmap.fmap) (+1),模糊类型 f0 和 a0 会被解析为有效实例即 [] 和 Int?
-
确实,你可以试试
(fmap . fmap) (+1) [] :: [[Int]],它会打印[]。