gpt4 book ai didi

haskell - 为什么这个定义没有涵盖所有模式案例?

转载 作者:行者123 更新时间:2023-12-04 17:08:36 25 4
gpt4 key购买 nike

所以我想triplize一个元素,即制作该元素的 2 个其他副本。

所以我写了这个:

triplize :: [a] -> [a]
triplize [x] = concatMap (replicate 3) [x]

但我一直收到这个错误:
Non-exhaustive patterns in function triplize

我是 Haskell 的新手,所以感谢您的指点!

最佳答案

当你写

triplize [x]

你是说参数必须匹配模式 [x] .此模式表示一个具有单个值的列表,该值将分配给名称 x .请注意,该列表不会分配给名称 x ,只有该列表中的单个值。如果您尝试使用列表 [] 调用您的函数或 [1, 2] ,它会导致错误,因为您没有告诉您的函数如何处理这些输入。

你可能想要的是
triplize x = concatMap (replicate 3) x

这里你的模式只是 x , 匹配任何列表,从空列表到无限列表。请注意,函数定义中的模式与您生成值本身的方式相匹配。在 Haskell 中,您可以对构造函数进行模式匹配,并且可以使用方括号和逗号构造列表,或者可以使用 : 构造它们。运算符,所以 [1, 2, 3] == (1:2:3:[]) .事实上, :运算符是 Haskell 在内部表示列表的方式。

使用更多模式匹配的示例:
sumSuccessive :: [Int] -> [Int]
sumSuccessive [] = [] -- Empty list
sumSuccessive [x] = [x] -- Singleton list (only one value)
sumSuccessive (x:y:rest) = x + y : sumSuccessive rest
-- Match a list with at least two elements `x` and `y`,
-- with the rest of the list assigned to the name `rest`

此示例函数将采用列表 [1, 2, 3, 4]并返回列表 [3, 7] ( [1 + 2, 3 + 4] )。

关于haskell - 为什么这个定义没有涵盖所有模式案例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32532651/

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