我有以下幾點:爲什麼我不能聲明推斷的類型?
runcount :: (Eq a, Num b) => [a] -> b
runcount = runcountacc 0
runcountacc :: (Eq a, Num b) => b -> [a] -> b
runcountacc n (_:[]) = runcountacc (n+1) []
runcountacc n (x:xs) = runcountacc (n+(if head xs==x then 0 else 1)) xs
runcountacc n _ = n
當我嘗試將其加載到擁抱生成該錯誤:
:6 - Cannot justify constraints in explicitly typed binding
*** Expression : runcountacc
*** Type : (Eq a, Num b) => b -> [a] -> b
*** Given context : (Eq a, Num b)
*** Constraints : Eq c
當加載到ghci中出現以下錯誤:
:6:23: Ambiguous type variable `a0' in the constraint:
(Eq a0) arising from a use of `runcountacc'
Probable fix: add a type signature that fixes these type variable(s)
In the expression: runcountacc (n + 1) []
In an equation for `runcountacc':
runcountacc n ([x]) = runcountacc (n + 1) []
但是,當刪除runcountacc
的類型聲明時:
runcount :: (Eq a, Num b) => [a] -> b
runcount = runcountacc 0
runcountacc n (_:[]) = runcountacc (n+1) []
runcountacc n (x:xs) = runcountacc (n+(if head xs==x then 0 else 1)) xs
runcountacc n _ = n
個
的代碼加載罰款,並在ghci中被要求的runcountacc
的類型是什麼,我們得到如下:
λ> :t runcountacc
runcountacc :: (Num a, Eq a1) => a -> [a1] -> a
爲什麼我不能宣佈推斷類型的runcountacc
?
首先,擁抱是古老的,你應該使用GHc。其次,這不是一個擁抱的具體問題,你會得到一個與ghc類似的錯誤。 – HaskellElephant
@HaskellElephant擁抱「古老」並不是避免它的好理由。實施仍然有效。 – singpolyma
@singpolyma,是的,它本身並不是很好的理由,但是自從最新版本是從2006年開始,它不被新庫支持,它不支持haskell 2010標準。此外,許多使用擁抱的理由(例如口譯員)已經在GHC中實施。 – HaskellElephant