在 [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。因此,ba 变成了 Ints,这在 a/b.

中成为问题

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

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