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