gpt4 book ai didi

haskell - Haskell 是否允许使用 let 表达式进行多个模式匹配?

转载 作者:行者123 更新时间:2023-12-02 16:36:09 25 4
gpt4 key购买 nike

假设我有一个函数可以进行一些计算,具有多种模式;以模式匹配的形式实现。

这些模式中的大多数都会(以及彼此不同的其他事物)对参数进行处理,为此我在 let 表达式中使用中间变量。但我发现在许多模式上使用相同的 let 确实是多余的,我想知道是否有一种方法可以为多个模式定义一个 let

这是我重复的 let 的示例:

data MyType a = Something a | Another Int [a]

myFunc (Something x) = -- return something, this isn't the point here
myFunc (Another 0 xs) =
let intermediary = some $ treatment xs
in doSthg intermediary 1
myFunc (Another 1 (x:xs)) =
let intermediary = some $ treatment xs
in doSthg1 intermediary 1 x
myFunc (Another 2 (x:x':xs)) =
let intermediary = some $ treatment xs
in doSthg2 intermediary 2 x x'

您可以看到,当我将其用作中介时,参数xs始终存在,并且可以将其分解。它可以通过使用辅助函数轻松实现,但我想知道如果没有辅助函数,我所要求的是否可行。对于初学者来说,请尽量保持简单,我希望我的示例足够清楚。

最佳答案

这个特定问题可以通过以下方式解决:

myFunc2 (Something x) = returnSomething x
myFunc2 (Another n ys) =
let xs = drop n ys
x = head ys
x' = head (tail ys)
intermediate = some $ treatment xs
in case n of
0 -> doSomething intermediate n
1 -> doSomething1 intermediate n x
2 -> doSomething2 intermediate n x x'

由于惰性求值,xx' 仅在需要它们的值时才会求值。

然而 - 这是一个很大的然而! - 当您尝试调用 myFunc2 (Another 2 []) 时,您的代码将给出运行时错误(并且如果 doSomething2 实际上使用 x!)因为要找出 x 是什么,我们需要评估 head ys - 这会因空列表而崩溃。您作为示例提供的代码对于 Another 2 [] 也不起作用(另一个运行时错误),因为没有匹配的模式,但提供后备情况更容易。

如果您控制输入并始终确保 Another 中的列表足够长,这可能不是问题,但了解这个问题很重要!

关于haskell - Haskell 是否允许使用 let 表达式进行多个模式匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15418855/

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