在 [x|x<-[1..n]] 中替换 n
Substitute n in [x|x<-[1..n]]
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'
为什么上面的代码会报如下错误:
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中可以运行;发生了什么事?
当你键入 n
时,你用你的表达式强制它变成了 Int
。因此,b
和 a
变成了 Int
s,这在 a/b
.
中成为问题
当您编写 3
时,文字是多态的,允许某些表达式使用 Int
,而某些表达式使用其他 Fractional a => a
。该函数中使用的 3
只是不同的值。
创建一个不同的值,例如 nP = fromIntegral n
should allow you to use n in every context,因为 nP
不应该被任何表达式固定化。
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'
为什么上面的代码会报如下错误:
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中可以运行;发生了什么事?
当你键入 n
时,你用你的表达式强制它变成了 Int
。因此,b
和 a
变成了 Int
s,这在 a/b
.
当您编写 3
时,文字是多态的,允许某些表达式使用 Int
,而某些表达式使用其他 Fractional a => a
。该函数中使用的 3
只是不同的值。
创建一个不同的值,例如 nP = fromIntegral n
should allow you to use n in every context,因为 nP
不应该被任何表达式固定化。