2015-03-03 60 views
2

在GHCiOnline,let listRestDiv 4 = floor(4/(fromInteger (nextPrimeDiv 4)))的工作,但一般缺少一定的Haskell的類型轉換

let listRestDiv n = floor(n/(fromInteger (nextPrimeDiv n))) 

不被接受,其中nextPrimeDiv n

let nextPrimeDiv n = head [x|x<-[1..n], n `mod` x == 0, x/=1] 

給出,只是返回下一個素因子。

它說:

從使用`地板」的從 上下文(積分b)由所述推斷出的類型的listRestDiv :: 積分B =>結合而產生無法推斷(RealFrac整數)整數 - > b在

並在那裏結束。我只是沒有在這裏得到類型。 在此先感謝您的任何提示。

+1

這是很好的做法,加類型,在這種情況下,它將解決問題。 – 2015-03-03 12:24:53

+1

正如@KarolyHorvath所示,最好爲所有頂級標識符編寫類型簽名,也爲一些非頂級標識符和表達式編寫類型簽名。這樣做可以讓你檢查編譯器,以確保你們兩個在轉向其他事情之前就你所定義的類型達成一致。雖然這個問題相當簡單,但你總有一天會得到一些可怕的類型檢查程序,這對你來說毫無意義 - 增加儘可能多的類型簽名,可以幫助你找出錯誤的具體位置。 'ScopedTypeVariables'有時候會有很大幫助。 – dfeuer 2015-03-03 14:45:23

回答

4

收到的實際完整的錯誤消息,暗示我們解決了這個問題。

Prelude> let listRestDiv n = floor(n/(fromInteger (nextPrimeDiv n))) 

<interactive>:8:21: 
    Could not deduce (RealFrac Integer) arising from a use of `floor' 
    from the context (Integral b) 
     bound by the inferred type of 
       listRestDiv :: Integral b => Integer -> b 
     at <interactive>:8:5-59 
    Possible fix: add an instance declaration for (RealFrac Integer) 
    In the expression: floor (n/(fromInteger (nextPrimeDiv n))) 
    In an equation for `listRestDiv': 
     listRestDiv n = floor (n/(fromInteger (nextPrimeDiv n))) 

<interactive>:8:28: 
    Could not deduce (Fractional Integer) arising from a use of `/' 
    from the context (Integral b) 
     bound by the inferred type of 
       listRestDiv :: Integral b => Integer -> b 
     at <interactive>:8:5-59 
    Possible fix: add an instance declaration for (Fractional Integer) 
    In the first argument of `floor', namely 
     `(n/(fromInteger (nextPrimeDiv n)))' 
    In the expression: floor (n/(fromInteger (nextPrimeDiv n))) 
    In an equation for `listRestDiv': 
     listRestDiv n = floor (n/(fromInteger (nextPrimeDiv n))) 

這裏要注意的重要一點是

Possible fix: add an instance declaration for (Fractional Integer) 
    In the first argument of `floor', namely 
     `(n/(fromInteger (nextPrimeDiv n)))' 

所以,你所要做的就是,使用fromIntegern還,這樣

Prelude> let listRestDiv n = floor(fromInteger n/(fromInteger (nextPrimeDiv n))) 
+0

不幸的是,它被切斷了 – 2015-03-03 12:36:03

+1

請注意,'floor(fromInteger n/fromInteger ...)= n'div' ...'' – 2015-03-03 16:08:47

+1

'\ n - > n \'div \'nextPrimeDiv n'也是更有效率,如果你是受虐狂的,可以寫成'div <$> id <*> nextPrimeDiv'。 – 2015-03-03 19:01:36

相關問題