2015-10-19 63 views
-1

所以基本上我正在採取項目清單,並添加到元組列表,使其更有效的方式來存儲/查看數據。我的代碼是頭函數拋出類型匹配錯誤Haskell

TList :: [a] -> a -> [(a,Int)] -> [(a,Int)] 
TList head [a] [] = [(head [a],1)] 
TList head [a] ((a',i):xa) 
    |a' == take 1 = (head 1,i+1):xa 
    |otherwise = (a',i) : TList drop 1 [a] xa 

,所以我的邏輯是,我採取的第一個項目在列表中,檢查是否已建好的元組列表,如果是添加一個到INT。通話功能再次,但沒有第一個列表項 但它一直給錯誤

Couldn't match expected type '[t1] -> a' with actual type '[a]' 

它給這個錯誤5次,每行一個。

+4

你寫的函數甚至不會解析:函數標識符必須以小寫字母開頭。請確保您正確地向您顯示您的代碼*。 –

回答

0

當你寫道:

TList head [a] [] = ... 

你的陰影原head功能。因此在這種情況下:

[(head [a],1)] 

它試圖評估它。我不知道爲什麼你只是在這裏使用了a,代碼很不明確,不能用該名稱編譯(大寫TList),但這是這種類型不匹配的根源。

4

所以,這不是你的問題的完整答案,因爲我不知道你到底想要達到什麼目的。但是,有幾件事情錯了代碼,我建議你通過固定它們,然後看它是如何開始:

  1. 函數名需要開始用小寫字母。因此,TList不是函數的合法名稱。 (類型和類型構造函數具有大寫名稱)。所以也許你想要tList

  2. 您正在命名參數head之一。但是head也是一個Prelude函數,而您實際上似乎使用了head函數(head [a])。但是你的參數head會影響頭部功能。另外head似乎是一個適當名單的奇怪名稱。

  3. head [a]head [a] == a似乎很奇怪。所以只有一個元素的列表頭就是這個元素。

  4. 我猜你試圖使用drop 1 [a](如果是這樣,你缺少括號)。這太奇怪了,因爲drop 1 [a] == []。只有一個元素的列表的drop 1始終是空列表。

  5. 你是模式匹配[a]第二個參數(類型a),並不能正常工作,因爲[a]只有列表類型[t]工作。

  6. a' == take 1確實沒有意義。 take 1需要一個列表作爲第二個參數take 1 [1, 2, 3] = [1]。因此,您需要將a類型的某個(a)與[a] -> [a]take 1 :: [a] -> [a])類型的其他類型進行比較。