[英]Haskell simple show the elements of a list program
我試圖在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
這里有一些問題。 首先,約束是用括號而不是括號寫的:
showw :: (Int a) => [a] -> b
這消除了一個錯誤。
現在我不確定您打算使用什么(Int a)
,但是Int
不是類型類,因此您不能像這樣使用它。 也許您的意思是a
是一個Int
,在這種情況下,我們根本不會使用類型變量,而只在其位置使用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
在其中嘗試將Int
( x
)與String
( showw xs
) showw xs
,這是不允許的。 您需要先將x
轉換為字符串,我想您應該使用常規show
函數來執行此操作。
也就是說, show
函數已經可以顯示列表。 但是我認為你在練習。
這里有一些問題。
第一個問題是類型簽名。 Int是一種類型,但是您的語法使其看起來像類型類。 如果您的函數需要一個Ints列表並輸出其他值,則它應如下所示:
func :: [Int] -> a
當然,僅當您打算將功能限制為Ints時,此方法才有效。 如果要包括其他類型的數字, 則需要使用類型類。 例如,如果要使用Num,則類型簽名將看起來像這樣:
func :: Num a => a -> b
但是,即使您修復了類型簽名,您仍然會遇到錯誤,因為函數的返回類型不一致。 showw []
返回0(一個Int),但非空列表上的showw
返回值列表。 您可能希望showw []
返回[0]
或[]
。
並且,如果要顯示這些值(如將它們轉換為字符串一樣),則需要使用一個函數來進行轉換。 您可以將該函數應用於第三行的x
以及showw []
的返回值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.