Integer product' (x:xs) | (x:xs) == [] = 1 | otherwise = x * (product-6ren">
gpt4 book ai didi

haskell - 我正在尝试重新定义 haskell 中的产品定义。我收到错误消息 "Non-exhaustive patterns in function"

转载 作者:行者123 更新时间:2023-12-02 06:26:22 25 4
gpt4 key购买 nike

product' :: [Integer] -> Integer
product' (x:xs)
| (x:xs) == [] = 1
| otherwise = x * (product' (xs))

第一个不起作用并给出错误。下面的例子使用了模式匹配技术并且工作得很好。

productP :: [Integer] -> Integer
productP [] = 1
productP (x:xs) = x * (productP (xs))

最佳答案

(x:xs) == [] 部分是无意义的:使用 (x:xs)构造一个列表至少有一个元素:x 作为第一个元素,xs 作为剩余元素的列表(可能为空)。因此,这总是会导致False

(x:xs) 模式的要点是它匹配非空列表。列表定义为:

data [a] = [] | (a:[a])  -- pseudo-code

因此,列表有两个数据构造函数:

  1. 空列表[];和
  2. “cons”(x:xs),它有一个头 x 和一个尾 xsx 是列表中的一个元素,xs 是剩余元素的列表。

您可以检查整个列表xs是否等于空列表,然后使用headtail:

product' :: [Integer] -> Integer
product' xs
| xs == [] = 1
| otherwise = head x * product' (tail xs)

但是上面的代码不是非常优雅,因为headtail是非总函数(它们对于空列表会出错),因此“更难”确定这个函数总是会产生答案。

关于haskell - 我正在尝试重新定义 haskell 中的产品定义。我收到错误消息 "Non-exhaustive patterns in function",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52693299/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com