为什么运营商**在运营商^工作的地方失败?
问题描述:
因此,这里有两个列表解析,首先使用^
,而第二个则使用**
:为什么运营商**在运营商^工作的地方失败?
> [x^2 | x <- [1..10], odd x]
[1,9,25,49,81]
> [x ** 2 | x <- [1..10], odd x]
<interactive>:9:1:
No instance for (Show t0) arising from a use of ‘print’
The type variable ‘t0’ is ambiguous
Note: there are several potential instances:
instance Show Double -- Defined in ‘GHC.Float’
instance Show Float -- Defined in ‘GHC.Float’
instance (Integral a, Show a) => Show (GHC.Real.Ratio a)
-- Defined in ‘GHC.Real’
...plus 23 others
In a stmt of an interactive GHCi command: print it
据我所知,这两个运营商之间的区别是,首部作品与整数,而第二部作品与浮点值。预期输出然后:
[1.0,9.0,25.0,49.0,81.0]
实际问题是:为什么第二个列表的理解失败?
答
正如你所说**
适用于浮动ponints。但odd
只适用于Integral
s。因此,您的第二个列表理解仅适用于类型为Floating
和Integral
的实例,并且此类型不存在。
但是我不知道为什么错误消息声称有26个可能的实例,当它提到的实例都没有实际满足所需的约束时。
那么'(^)'和'(**)'的类型是什么?你可以在GHCi中用':type'或':t'命令找到它。 – bheklilr 2014-10-10 15:00:33
@bheklilr,'(^)::(Num a,Integral b)=> a - > b - > a'和'(**):: Floating a => a - > a - > a' ...不过我可以这样做:在GHCi中'10^2'和'10 ** 2'。首先给出输出“100”,第二给出输出“100.0”。如果我移除条件'odd x'这两个解析工作...奇怪... – Mark 2014-10-10 15:03:13