基本上,你有兩種可能性:
事情是這樣的:
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