簡體   English   中英

使用foldr throw類型錯誤的Haskell計數長度

[英]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未使用且bNum ,但它不知道t

它可以通過類型定義來解決:

lengthList :: (Foldable t, Num a1) => t a2 -> a1

這很奇怪,但如果只是將函數粘貼到解釋器,它將在沒有類型定義的情況下正常工作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM