Haskell I';我试图在哈斯克尔中重新定义产品定义。我会听到一个错误,说“我;“函数中的非穷举模式”;
第一个不起作用,会出现错误。下面的一个使用模式匹配技术,效果很好Haskell I';我试图在哈斯克尔中重新定义产品定义。我会听到一个错误,说“我;“函数中的非穷举模式”;,haskell,recursion,pattern-matching,Haskell,Recursion,Pattern Matching,第一个不起作用,会出现错误。下面的一个使用模式匹配技术,效果很好 product' :: [Integer] -> Integer product' (x:xs) | (x:xs) == [] = 1 | otherwise = x * (product' (xs)) (x:xs)=[]部分是非感官的:使用(x:xs)可以构造一个至少包含一个元素的列表:x作为第一个元素,xs作为剩余元素的(可能为空)列表。因此,这将始终导致False (x:xs)模式的要点是它匹配非空列表。
product' :: [Integer] -> Integer
product' (x:xs)
| (x:xs) == [] = 1
| otherwise = x * (product' (xs))
(x:xs)=[]
部分是非感官的:使用(x:xs)
可以构造一个至少包含一个元素的列表:x
作为第一个元素,xs
作为剩余元素的(可能为空)列表。因此,这将始终导致False
(x:xs)
模式的要点是它匹配非空列表。列表定义为:
productP :: [Integer] -> Integer
productP [] = 1
productP (x:xs) = x * (productP (xs))
因此,列表有两个数据构造函数:
[]
;及(x:xs)
,它有一个头部x
,一个尾部xs
x
是列表的一个元素,xs
是剩余元素的列表xs
是否等于空列表,然后使用head
和tail
:
data [a] = [] | (a:[a]) -- pseudo-code
但是上面的内容并不十分优雅,因为头和尾是非总体函数(它们对于空列表是错误的),因此“更难”确定这个函数总是会产生一个答案。(x:xs)=[]
是不敏感的,因为这永远不会发生。
product' :: [Integer] -> Integer
product' xs
| xs == [] = 1
| otherwise = head x * product' (tail xs)