gpt4 book ai didi

haskell - Haskell 中的 As (@) 模式

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

我在 Haskell 中编写了自己的 take 函数,如下所示:

take' :: (Integral n, Eq a) => n -> [a] -> [a]
take' n lst
| n <= 0 = []
| lst == [] = []
| otherwise = (head lst) : (take' (n-1) $ tail lst)

而且效果很好。

但是当我尝试在函数参数中使用 as (@) 模式编写相同的函数时,该函数似乎无法识别第二个保护选项:

take' :: (Integral n, Eq a) => n -> [a] -> [a]
take' n lst@(hd:tl)
| n <= 0 = []
| lst == [] = []
| otherwise = hd : (take' (n-1) $ tl)

当我在 ghci 中尝试 take' 20 [] 时,出现 Non-exhaustive Patterns in function take' 错误。

我做错了什么?

谢谢,斯佩拉。

最佳答案

看这里:

lst == [] = []

lst 永远不可能等于 [],因为您说过 lst = hd:tl。相反,您可以将该分支从防护中分离出来并分成独立的模式匹配以获得完整的覆盖。 (一旦执行此操作,您也可以删除 Eq 约束。)

当您调用 take' 20 [] 时,它会尝试查找与之匹配的模式,但您还没有编写模式:hd:tl 不能与 [] 匹配。当模式无法匹配后,它不会查看该模式的守卫。

关于haskell - Haskell 中的 As (@) 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32504746/

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