簡體   English   中英

Haskell,即使我的類型未指定,我也會收到此錯誤:無法將類型“a”與“[a]”匹配,“a”是綁定的剛性類型變量

[英]Haskell, Even though my type is not specified I get this error: Couldn't match type `a' with `[a]', `a' is a rigid type variable bound by

所以我意識到這是一個可能重復的問題,因為在Stack Overflow上報告了許多錯誤,但沒有一個解決方案似乎適用於我的問題。

所以我有以下功能:

elementAt' :: Integral b => [a] -> b -> a
elementAt' [x:_] 1 = x
elementAt' [x:xs] y = elementAt' xs yminus1
    where yminus1 = y - 1

如果您想知道99 Haskell問題中的問題3。 該函數的目標是將列表和索引作為輸入,並返回該索引處的值(從1開始)。 我不想解決這個問題,如果我這樣做,我可以看看提供的解決方案。 但我收到一個我不明白的錯誤。 我正在使用eclipseFP,它是haskell的eclipse插件,它強調了函數的“[x:_]”和“[x:xs]”部分,並出現以下錯誤:

Couldn't match type `a' with `[a]'
`a' is a rigid type variable bound by
the type signature for elementAt' :: Integral b => [a] -> b -> a

在討論這個錯誤的所有線程中,我已經看到問題通常發生在有人試圖將錯誤的輸出提供給需要某種類型的東西時。 例如,將某些東西(Int類型)的長度返回到應該是“Num a”變量類型的長度。

但在我的情況下,我甚至沒有提供變量a的類型。 它應該可以是任何東西,對吧? 那我為什么會收到這個錯誤呢? 如果我理解為什么我得到錯誤我可以解決它,但我只是不明白。

有人可以向我解釋為什么我收到這個錯誤?

非常感謝您的幫助,謝謝。 -Asaf

編輯:到目前為止提供的每個答案都是正確的,謝謝大家提供的有用信息。 我要選擇一個我認為最清楚的那個(我必須等5分鍾才能完成)。

輸入沒有類型聲明的定義表明推斷類型是Integral b => [[a]] -> b -> a 這是正確的,您當前的模式匹配列表列表。

像一個模式

f [pat] = ...

匹配其唯一元素匹配pat的單例列表。 你想使用cons aka (:)而不是需要一定的長度,然后你需要括號而不是括號:

elementAt' (x:xs) n = ...

錯誤基本上說“你把a (第一個參數的元素),如果它是一個列表”。

如果你想將列表匹配到head和tail,你應該使用

elementAt' (x:_) 1 = x

所以,最后

elementAt' :: Integral b => [a] -> b -> a
elementAt' (x:_) 1 = x
elementAt' (x:xs) y = elementAt' xs yminus1
    where yminus1 = y - 1

λ> elementAt' [1,2,3] 2
2

這是你需要的嗎?

但在我的情況下,我甚至沒有提供變量a的類型。 它應該可以是任何東西,對吧?

它必須能夠成為任何東西。 根據您的類型簽名的功能,用戶必須能夠調用你的函數與aInt ,用a幸福[Char]或'其他任何用戶想要A'的存在。

然而,錯誤信息告訴你,所以,它是唯一可能與調用它,你定義你的功能a是東西的清單。 即你定義它,所以第一個參數必須是列表列表 - 它不能是其他任何列表。 這與你的類型簽名相矛盾。

使用括號,而不是括號: (x:xs)

module Aaa where

elementAt' (x:_) 1 = x
elementAt' (x:xs) y = elementAt' xs yminus1
    where yminus1 = y - 1

暫無
暫無

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

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