在[x | x < - [1..n]]中替换n

时间:2015-10-16 13:58:26

标签: haskell monads

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'

为什么上面的代码会出现以下错误:

  

使用'/'时没有(Fractional Int)的实例      在表达式中:(b / a)

     

在'm'的等式中:m =(b / a)

     

在'($)'的第二个参数中,即

 ‘[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 个答案:

答案 0 :(得分:3)

当您输入n时,您强制它与您的表达式成为Int。因此,ba变为Int,这在a/b中成了问题。

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

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

相关问题