2015-10-16 94 views
1
test n = (sum s)*4+2*(n-1)*((l')^2)-2*(n-1)*(l') 
    where 
     p =sort $[ m | a<-[1..(n-1)],b<-[1..(n-1)],let m= (b/a), (a^2+b^2< (n^2))] 
     l'= length p 
     s = (product a) : next a (group p) 
     where 
      a = [(n-1),2*(l')+(n-2)] 
      next [x,y] (z:z':zs) = case (null zs) of 
      False -> (x')*(y')*l : next [x',y'] (z':zs) 
      True -> (x')*(y')*l :[] 
      where 
       l = length z 
       x' = x+l 
       y' = y-length z' 

为什么上面的代码提供以下错误:替代n的[X | X < - [1..N]]

No instance for (Fractional Int) arising from a use of ‘/’ In the expression: (b/a)

In an equation for ‘m’: m = (b/a)

In the second argument of ‘($)’, namely

‘[m | 
    a <- [1 .. (n - 1)], 
    b <- [1 .. (n - 1)], 
    let m = (b/a), 
    (a^2 + b^2 < (n^2))]’ 

但是,当我在代码取代n=3手工:

test' = (sum s)*4+2*(3-1)*((l')^2)-2*(3-1)*(l') 
    where 
     p = sort $[ m | a<-[1..(3-1)],b<-[1..(3-1)],let m= (b/a), (a^2+b^2< (3^2))] 
     l'= length p 
     s = (product a) : next a (group p) 
     where 
      a = [(3-1),2*(l')+(3-2)] 
      next [x,y] (z:z':zs) = case (null zs) of 
      False -> (x')*(y')*l : next [x',y'] (z':zs) 
      True -> (x')*(y')*l :[] 
      where 
       l = length z 
       x' = x+l 
       y' = y-length z' 

然后它可以在GHCi中运行;发生什么事?

+1

您可能会发现有趣的是,知道类型理论家通常会证明他们的系统是beta测试重视打字;也就是说,如果'(\ x - > e)e''可以被赋予't'类型,那么'e [e'/ x]'(我们用'e'替换' e')也可以被赋予't'类型。然而,相反的情况通常并不正确:'e [e'/ x]'可能比'(\ x - > e)e''更多的类型。特别是当'e''是多态的时候 - 因为'3'在你的例子中 - 但被函数应用强制为单态。 –

回答

3

当您键入n时,您会强制它将您的表达式变为Int。因此,ba变成了Ints,这在a/b中变得有问题。

当您编写3时,文字是多态的,允许一些表达式使用Int,有些使用其他Fractional a => a。在该函数中使用的3只是不同的值。

创建不同的值,例如nP = fromIntegral nshould allow you to use n in every context,因为nP不应该被任何表达式强化。

+1

只有当您为'nP'写入类型签名(或禁用单态限制)时,最后一句才是真实的。 –

+0

@ReidBarton我猜想单态限制是为了避免意外执行而设置的。 –

+1

这回答了这个问题,但似乎没有得到这个代码的各种问题,例如在范围中使用非整数数字是比较阴暗的事实。 – dfeuer

相关问题