2017-03-03 36 views
0

雖然學習Haskell我想寫賦予了許多將給其繼任者在Collatz sequence功能:當我運行next 7我得到使用'print'引起的模糊變量`a0'?

next :: (Fractional a, Integral a) => a -> a 
next x 
    | odd x = x * 3 + 1 
    | otherwise = x/2 

<interactive>:150:1: error: 
* Ambiguous type variable `a0' arising from a use of `print' 
    prevents the constraint `(Show a0)' from being solved. 
    Probable fix: use a type annotation to specify what `a0' should be. 
    These potential instances exist: 
    instance Show Ordering -- Defined in `GHC.Show' 
    instance Show Integer -- Defined in `GHC.Show' 
    instance Show a => Show (Maybe a) -- Defined in `GHC.Show' 
    ...plus 22 others 
    ...plus 12 instances involving out-of-scope types 
    (use -fprint-potential-instances to see them all) 
* In a stmt of an interactive GHCi command: print it 

兩個問題:

  1. 我在我的簽名中使用了最好的類限制嗎?
  2. 假設我是,我如何shownext 7的結果?
+6

沒有類型滿足'(分數a,積分a)'。你想刪除'Fractional'並使用''''''''而不是''''''''' – Alec

+0

謝謝 - 這很有效,我學到了一些新東西。你想發佈一個答案,我可以接受嗎? – urig

+1

我建議使用更具體的類型:'Int - > Int'。 –

回答

1

我相信Collat​​z序列是一個整數序列,所以不需要做結果分數。

next :: (Integral a) => a -> a 

爲了能夠從分部得到整數,應該使用div函數。請注意,劃分將始終準確,因爲您將只劃分偶數:

next x 
    | odd x = x * 3 + 1 
    | otherwise = x `div` 2