[英]Haskell count length using foldr throw type error
嘗試通過foldr函數實現列表計數
lengthList = foldr (\x s -> s + 1) 0
給出以下錯誤
* Ambiguous type variable `t0' arising from a use of `foldr'
prevents the constraint `(Foldable t0)' from being solved.
Relevant bindings include
lengthList :: t0 a -> Integer (bound at lenListFoldr.hs:2:1)
Probable fix: use a type annotation to specify what `t0' should be.
These potential instances exist:
instance Foldable (Either a) -- Defined in `Data.Foldable'
instance Foldable Maybe -- Defined in `Data.Foldable'
instance Foldable ((,) a) -- Defined in `Data.Foldable'
...plus one other
...plus 23 instances involving out-of-scope types
(use -fprint-potential-instances to see them all)
* In the expression: foldr (\ x s -> s + 1) 0
In an equation for `lengthList':
lengthList = foldr (\ x s -> s + 1) 0
我該如何解決這個問題?
添加類型簽名:
lengthList :: [a] -> Int
或類似的東西。 錯誤說明:“可能的修復:使用類型注釋來指定`t0'應該是什么。” 換句話說,編譯器無法推斷出類型。 或者,作為注釋聲明:在上下文中使用該函數,然后編譯器將使用上下文來推斷lengthList
正確類型。 我相信函數foldr
使用類約束Foldable t
; 在您的情況下,編譯器不知道lengthList
正在折疊。 通過給出上面的簽名,你將t0
綁定為一個列表。 看看GHCi給出的輸出
:t foldr
foldr :: Foldable t => (a -> b -> b) -> b -> t a -> b
簡而言之,GHC可以發現a
未使用且b
是Num
,但它不知道t
。
它可以通過類型定義來解決:
lengthList :: (Foldable t, Num a1) => t a2 -> a1
這很奇怪,但如果只是將函數粘貼到解釋器,它將在沒有類型定義的情況下正常工作
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.