【发布时间】:2015-10-16 13:58:26
【问题描述】:
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中运行了;发生了什么事?
【问题讨论】:
-
你可能会发现有趣的是,类型理论家通常证明他们的系统的一件事是 beta 减少尊重类型;也就是说,如果
(\x -> e) e'可以被赋予类型t,那么e[e'/x](我们在e的任何地方用e'替换x的术语)也可以被赋予类型t。但是,相反的情况通常不正确:e[e'/x]的类型可能比(\x -> e) e'多。特别是当e'是多态的——就像你的例子中的3——但被函数应用程序强制为单态。