为什么运营商**在运营商^工作的地方失败?

问题描述:

因此,这里有两个列表解析,首先使用^,而第二个则使用**为什么运营商**在运营商^工作的地方失败?

> [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] 

实际问题是:为什么第二个列表的理解失败?

+1

那么'(^)'和'(**)'的类型是什么?你可以在GHCi中用':type'或':t'命令找到它。 – bheklilr 2014-10-10 15:00:33

+0

@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

正如你所说**适用于浮动ponints。但odd只适用于Integral s。因此,您的第二个列表理解仅适用于类型为FloatingIntegral的实例,并且此类型不存在。

但是我不知道为什么错误消息声称有26个可能的实例,当它提到的实例都没有实际满足所需的约束时。

+0

嗯...我想'当奇数x'发生'x'是来自源列表的整数...或Haskell考虑列表'[1..10]'自动键入'Floating'? – Mark 2014-10-10 15:17:56

+2

@Mark Haskell认为'[1..10]'是你所需要的'Num a => [a]'的任何实例。在你的情况下,你做'x ** 2',它告诉Haskell'x'必须是'Floating'的一个实例,因此'[1..10]'必须是'Floating a => [a] '。 – sepp2k 2014-10-10 15:20:41