gpt4 book ai didi

具有模式匹配的 Haskell `where`

转载 作者:行者123 更新时间:2023-12-04 00:57:51 25 4
gpt4 key购买 nike

我有这样的功能:

eval :: Expr -> Either ArithmeticError Int
eval (Const a) = Right a
eval (Add a b) = liftM2 (+) ea eb
where
ea = eval a
eb = eval b
eval (Sub a b) = liftM2 (-) ea eb
where
ea = eval a
eb = eval b

我想用一个 where 用法重写它。我可以做吗?但是模式匹配应该留在这段代码中。谢谢!

最佳答案

没有通用、直接的方法来匹配具有公共(public)变量的模式:

foo (Bar a b) = ...
foo (Baz a b) = ...

然后编写表达式(在 where 子句或其他地方)使得 ab 同时对应于两种模式。在 Haskell 中,一个模式创建了一个新的范围,其中模式中的变量被该模式绑定(bind),并且没有办法“组合”这些绑定(bind)——ab< 的用法要么引用Bar a b Baz a b 中的绑定(bind),永远不会同时引用两者。

你能做的最好的事情就是使用 case 语句将通用的 where 子句应用于多个模式,并使用一个通用的辅助函数来获取 ab 作为参数,并在逐个模式的基础上显式地将它们重新绑定(bind)到通用名称:

eval :: Expr -> Either ArithmeticError Int
eval e = case e of
Const a -> Right a
Add a b -> go (+) a b
Sub a b -> go (-) a b

where go op a b = liftM2 op (eval a) (eval b)

关于具有模式匹配的 Haskell `where`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60820936/

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