我有一個函式,它接受一個字符和一個元組串列,并顯示元組中的一個元素。這是功能:
foo [a] ((x,y):xs) = x
但是,當我嘗試運行時,它編譯得很好
foo 'a' [('b',1),('c',2)]
它給了我這個錯誤:
<interactive>:2:5: error:
? Couldn't match expected type ‘[a10]’ with actual type ‘Char’
? In the first argument of ‘foo’, namely ‘'a'’
In the expression: foo 'a' [('b', 1), ('c', 2)]
In an equation for ‘it’: it = foo 'a' [('b', 1), ('c', 2)]
我如何在 foo 的定義中宣告一個字符“a”,這樣foo 'a' [('b',1),('c',2)]不會給我這個錯誤?
uj5u.com熱心網友回復:
用@Silvo Mayolo 的評論解決了這個問題 僅使用 a 而不是 [a],因為我試圖匹配單個字符而不是串列。
uj5u.com熱心網友回復:
與您在串列中第一個元組的第一個元素中接受單個字符的方式相同;你期望那里有一個字符,只是寫了一個變數名x來系結到那個字符的值。
任何時候你想接受任何值1作為引數,只需使用一個變數名;a或x或y或theCharacter,任何你喜歡的名字。
如果您撰寫的模式具有更多結構(例如[a], or (x, y), or Just a, or ((x,y):xs)),那么您不僅接受任何引數值1,而且您正在撰寫一個模式匹配,該匹配僅適用于具有相同“形狀”的值" 作為您的模式(例如,[a]匹配一個只有一個元素((x,y):xs)的串列,匹配一個至少有一個元素的串列,該元素的第一個元素是xand的元組,y尾部是xs,等等)。
在您使用模式[a]Haskell的情況下,推斷此引數的型別必須是某種串列。'a'是 a Char,它不是一個串列,所以這是一個型別錯誤。但是,如果您確實想在那里傳遞一個串列,那么您的模式仍然很可能是錯誤的。[a]匹配一個只有一個元素的串列;空串列或長度超過 1 的串列將不匹配此模式,因此只有[a]當您有其他情況將覆寫具有零個或多個元素的串列時,才將其用作模式。如果你只想接受任何串列而不關心你有多少元素,你可以做與任何其他型別相同的事情:只寫一個變數名。
1型別正確。您仍然受到函式及其引數的宣告或推斷型別的約束!
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/316835.html
標籤:哈斯克尔
