Haskell:函数中的非穷举模式。不知道为什么
我正在学习Haskell,并尝试实现luhn算法 我创建了一个助手函数:Haskell:函数中的非穷举模式。不知道为什么,haskell,Haskell,我正在学习Haskell,并尝试实现luhn算法 我创建了一个助手函数: myMap :: (a -> b) -> (a -> b) -> [a] -> [b] myMap p q [] = [] myMap p q [x] = [p x] myMap p q (x : y : xs) = p x : q y : myMap p q xs 此函数工作正常。如果我尝试以myMap(*2)(+0)[1,2,3,4]的形式运行它,它将返回[2,2,6,4],这是预期的结
myMap :: (a -> b) -> (a -> b) -> [a] -> [b]
myMap p q [] = []
myMap p q [x] = [p x]
myMap p q (x : y : xs) = p x : q y : myMap p q xs
此函数工作正常。如果我尝试以myMap(*2)(+0)[1,2,3,4]
的形式运行它,它将返回[2,2,6,4]
,这是预期的结果
然后我尝试实现luhn算法:
luhn :: [Int] -> [Int]
luhn [x] = myMap (*2) (+0) [x]
这是算法的一部分,我会将其更改为返回一个Bool
,但我尝试按此方式运行,它会给出:
***例外:main.hs:92:1-30:函数luhn中的非穷举模式
为什么会发生这种情况?例如,luhn[]会是什么 您的函数当前是为一个元素列表定义的。其他名单呢 它可以是:
luhn [x] = your code
luhn whatever_else = error "That's an error!"
谢谢大家,真是愚蠢的错误
luhn :: [Int] -> [Int]
luhn x = myMap (*2) (+0) x
这是实现该功能的正确形式。我不知道为什么我把luhn[x]=myMap(*2)(+0)[x]
这种方式现在起作用了。你的意思是说这只适用于单身人士列表吗?或者你的意思是它适用于所有的列表:例如,
luhn xs=myMap(*2)(+0)xs
,这反过来又可以简化为luhn=myMap(*2)(+0)
(我更愿意写id
,而不是(+0)
,但这没有区别)。不确定这是你犯的错误,但一个常见的误解是模式[x]
将匹配一个列表(与其他类型的值相反),并将其绑定到x
,而不是匹配包含单个元素的列表。