我有一個類型定義爲這樣:'x'被定義爲'y',但編譯器無法將'y'與'x'匹配,爲什麼?
data People = People [[String]]
和看起來像這樣一個函數定義:
myFunction :: ([String], People) -> (Int, Int) -> People
myFunction first_tuple second_tuple = filter (myPredicate (fst second_tuple) (fst first_tuple)) (snd first_tuple)
這給了我下面的錯誤:
error:
* Couldn't match expected type `[[String]]'
with actual type `People'
* In the second argument of `filter', namely `(snd first_tuple)'
這有我真的難倒,因爲我試圖儘可能明確與我的括號和People
是明確的y定義爲[[String]]
。是什麼導致這種情況,爲什麼是這種情況?
這裏是myPredicate
類型簽名:
myPredicate :: Int -> [String] -> [String] -> Bool
請包括'myPredicate'的定義 - 現在你的代碼也包含多個錯誤('MyFunction'應該是'myFunction'),如果你正在通過'[[String]]過濾'People',你需要通過應用構造函數將後者轉換爲'People'。 – epsilonhalbe
'人'是用'[[String]]來定義的,但不同於'[[String]]',也不能互換。它絕對沒有被定義爲** ** [[String]]'。 –
@epsilonhalbe我編輯了我的帖子以包含'MyPredicate'的類型定義。 – JavascriptLoser