簡體   English   中英

Haskell:具有多個頂級綁定的“ where”子句?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM