2017-05-12 14 views
0

我嘗試在Haskell中創建一個函數來顯示列表的元素,但它不起作用。我做錯了什麼?Haskell簡單顯示列表程序的元素

showw :: [Int a]=> [a] -> b 
showw []=0 
showw (x:xs)= x ++ showw xs 

它給我這個錯誤:

aplicatie.hs:1:12: error: 
• Expected a constraint, but ‘[Int a]’ has kind ‘*’ 
• In the type signature: afisare :: [Int a] => [a] -> b 
aplicatie.hs:1:13: error: 
• Expecting one fewer argument to ‘Int’ Expected kind ‘* -> *’, but 
    ‘Int’ has kind ‘*’ 
• In the type signature: afisare :: [Int a] => [a] -> b 
+1

它是如何工作的? –

+0

它給了我這個錯誤: aplicatie.hs:1:12:error: •預期的約束,但'[Int a]'有'*' •在簽名類型中: afisare :: [Int a ] => [a] - > b aplicatie.hs:1:13:error: •期望減少一個參數到'Int' 預期種類'* - > *',但是'Int'具有種類'*' •在簽名類型中: afisare :: [Int a] => [a] - > b –

+0

您應該將其添加到問題中。 – Cirdec

回答

1

這裏有幾個問題。

第一個問題是類型簽名。 Int是一個類型,但是你的語法使它看起來像一個類型類。如果你有一個函數,它接受INTS的列表,並輸出一些其它的值,它應該是這樣的:

func :: [Int] -> a 

當然,只有當你的意思是限制的功能,以整數的工作。如果你想包含其他種類的數字,你需要使用一個類型類。如果你想使用次數,例如,類型簽名會,而不是像這樣:

func :: Num a => a -> b 

但即使你解決,因爲返回類型的你還是會得到一個錯誤的類型簽名,你的功能不一致。 showw []返回0(一個Int),但非空列表上的showw返回值列表。您可能需要showw []來代替[0][]

如果你想顯示這些值,因爲在將它們轉換爲字符串,你需要使用一個函數來做這種轉換。您可以將該函數應用於第三行的x,並將其應用於返回值showw []

+1

好的第一句話,bro – luqui

+0

很好的想法,我猜? –

1

這裏有幾個問題。首先,使用括號書寫約束條件,而不是括號:

showw :: (Int a) => [a] -> b 

這樣可以避免一個錯誤。

現在我不確定你想要什麼(Int a),但Int不是一個typeclass,所以你不能這樣使用它。也許你的意思aInt,在這種情況下,我們不會在所有使用一個類型變量,只是使用Int類型在它的地方:

showw :: [Int] -> b 

現在有這個b左右浮動所有的孤單,寂寞類型變量通常是一個問題。它說,showw可以返回任何類型的所有,所以如果我說,嘿,showw,這裏的[1,2,3,4,5],給我一個Elephant它將不得不返回一頭大象。

既然要「秀」列表中,我假設你想返回String

showw :: [Int] -> String 

這是一個合理的簽名。現在執行:

show [] = 0 

要顯示一個空列表,你...給0?這沒有意義。您可能需要空字符串""

然後將此行:

showw (x:xs) = x ++ showw xs 

在你試圖用Stringshoww xs)來連接的Intx),這是不允許的。您需要先將x轉換爲字符串,我想您應該使用常規的show函數來執行此操作。

也就是說,show函數已經可以顯示列表。但我認爲你在練習。

+0

最終的程序應該如何查看?對不起,我是Haskell的新手 –