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))
因此,列表有两个数据构造函数:

  • 空列表
    []
    ;及
  • “cons”
    (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)