2015-10-16 91 views
1
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中運行;發生什麼事?

+1

您可能會發現有趣的是,知道類型理論家通常會證明他們的系統是beta測試重視打字;也就是說,如果'(\ x - > e)e''可以被賦予't'類型,那麼'e [e'/ x]'(我們用'e'替換' e')也可以被賦予't'類型。然而,相反的情況通常並不正確:'e [e'/ x]'可能比'(\ x - > e)e''更多的類型。特別是當'e''是多態的時候 - 因爲'3'在你的例子中 - 但被函數應用強制爲單態。 –

回答

3

當您鍵入n時,您會強制它將您的表達式變爲Int。因此,ba變成了Ints,這在a/b中變得有問題。

當您編寫3時,文字是多態的,允許一些表達式使用Int,有些使用其他Fractional a => a。在該函數中使用的3只是不同的值。

創建不同的值,例如nP = fromIntegral nshould allow you to use n in every context,因爲nP不應該被任何表達式強化。

+1

只有當您爲'nP'寫入類型簽名(或禁用單態限制)時,最後一句纔是真實的。 –

+0

@ReidBarton我猜想單態限制是爲了避免意外執行而設置的。 –

+1

這回答了這個問題,但似乎沒有得到這個代碼的各種問題,例如在範圍中使用非整數數字是比較陰暗的事實。 – dfeuer

相關問題