基本上,你有两种可能性:
事情是这样的:
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)
你可以进一步避免拉姆达:
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
这也将让编译器知道该列表的头部的所有可能的形式都包括在内,所以这个我” d术语是实现它的最佳方式。
当你已经在模式守卫,为什么不在那里包括'x == fname'条件?它非常适合。 - 另一方面,我更喜欢把逗号放在一开始,与'|'一致,就像Haskell中相当常见的样式一样(当然,这是一个有趣的事情)。 – leftaroundabout
@leftaroundabout看到,当行以逗号开始时,我可能会讨厌它。除此之外。我将编辑我的帖子以显示'x == fname' – Ingo
Exaustive答案,我选择最后的样式,谢谢! – optimusfrenk