[英]Haskell: “where” clause with multiple top-level bindings?
這必須是一個FAQ,但是我在關於let
vs where
眾多問題中找不到它,所以……我想將表達式從多個頂級綁定中分解出來,而僅將其限制在那些綁定中。 如果我有一個帶有“ where”子句的綁定,則可以這樣做:
foo = ... bar ... bar ...
where bar = ...
並且如果我對於相同的頂級綁定具有多個保護方程:
foo = x | ... bar ...
| ... bar ...
where bar = ...
但是似乎沒有辦法在“ where”的范圍內有多個頂級綁定,就像這樣:
foo = ... bar ...
baz = ... bar ...
where bar = ...
我也必須在頂層定義bar
。 沒什么大不了的,但是最好將其范圍更緊密一些。 我想念什么嗎? 謝謝!
你不會失去了一些東西,它只是一個where
只適用於單一的表達。 因此,在第一個示例中,您只有一個表達式,在第二個示例中,單個表達式是您的守衛,在第三種情況下,您有兩個差異表達式。 作為參考,您可以在此處查看 Haskell 98語法的技術說明,但相關部分是
rhs -> = exp [where decls]
| gdrhs [where decls]
其中指出,一個定義的右手側可以具有任選的由一個表達的where
與聲明,或具有可選的保護右手側where
與聲明。
如果您需要使用兩個函數進行綁定,則必須在同一范圍內對其進行定義,這就是它的工作方式。
不過,有一種解決方法。 你可以做類似的事情
foo :: Int
bar :: String
(foo, bar) = (2 * baz, show baz)
where baz = 1
但是我個人更希望在頂層看到baz
,而不是在頂層定義(foo, bar)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.