gpt4 book ai didi

haskell - 格式化长模式匹配

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

我想格式化这个函数:

getEnv :: [Func] -> ([Char] -> RetType)
getEnv [] = (\_ -> undefined)
getEnv ((Func (RetTypeType t) (Ident fname) _ _):fs) = (\x -> if x == fname then t else getEnv fs)

问题是由长模式匹配引起的,目前我不想更改构造函数的名称。另外,第三行函数的右侧部分对我来说也不容易格式化。

虽然这并不生死攸关,但我很好奇你如何格式化这段代码。谢谢。

最佳答案

基本上,你有两种可能性:

类似这样的事情:

getEnv ((Func 
(RetTypeType t)
(Ident fname) _ _)
:fs)
= (\x -> if x == fname then t else getEnv fs)

或者您可以使用模式保护:

getEnv (h:fs)
| Func a b _ _ <- h,
Rectype t <- a,
Ident fname <- b
= (\x -> if x == fname then t else getEnv fs)

您还可以避免 lambda:

getEnv (h:fs) x
| Func a b _ _ <- h,
Rectype t <- a,
Ident fname <- b
= if x == fname then t else getEnv fs

“开放”模式保护的缺点可能是编译器无法再决定您的模式是否详尽。

正如 @leftaroundabout 所指出的,我们可以这样说得更清楚:

getEnv (h:fs) x
| Func a b _ _ <- h,
Rectype t <- a,
Ident fname <- b,
x == fname = t
| otherwise = getEnv fs

这也将使编译器知道列表头部的所有可能形式都已涵盖,因此我将其称为最首选的方法。

关于haskell - 格式化长模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21160428/

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