ここのものを定義する3類似した(しかし、明確な)方法があります: - ほとんどの方程式スタイルのバインディング
は、あなたが特定の定義後where
句を添付することができ、このよう
。だから、関数の最後に、またはlet
またはそれに囲まれたwhere
節で定義されたものを置くことができます。一方
、let x = ... in ...
はlet
後のものが表示されている唯一の場所である、in
後部分に評価式あります。
ブロック内にスコープの暗黙のネストがあるため(最初に定義された後に表示されます)、let x = ...
だけを使用できます。これは、以前のフォームと実際は同じです - let
の後のdo
ブロックの残りは実質的にin ...
部分です。
あなたはdo
ブロック内で定義されたものを使用してローカル定義をしたい場合は、あなたの唯一の選択肢は、第三(または引数(複数可)として他の値(複数可)を渡して)です。しかし、あなたの例のような独立したヘルパー関数の場合、どんなスタイルでも動作します。ここではあなたの例だ、それぞれを発揮します
func
が他where
句で定義されたものを含め、どこにでもfoo
に表示されている最初のスタイル、:
foo = do ...
mapM_ func aList
...
return aValue
where func x = x + 1
秒スタイル、func
は内部のみ表示されます
foo = let func x = x + 1
in do
...
mapM_ func aList
...
return aValue
そして第三に、スタイル、定義:この場合には全体do
ブロックでlet
表現、それはdo
ブロック内にあります。この場合、func
はlet
の後にのみ表示されます。最初の...
ではまだ定義されていません。
foo = do ...
let func x = x + 1
mapM_ func aList
...
return aValue
ああ、良い対策のため:let ... in ...
が表現されているので、あなたはまた、いくつかの地元の定義に名前を付けるために、あなたが表現を持ってどこにでもそれを使用することができます。だからここにもう一つの例です。前と同じように
foo = do ...
let func x = x + 1 in mapM_ func aList
...
return aValue
、func
は、この場合にはどこにも、それの後に単一の式でlet
表現、内部にのみ表示されます。
ありがとうございます。 3番目の形式は、 'mapM_'に十分近づいてラムダ関数を定義できるようになります。私は、 'let'(マイナーな問題)で定義された' func'という名前でトップレベルの関数名前空間を汚染することだけを心配しています。 – Ralph
@Ralph:これは、どのようなスコープを表示したいのかという問題です。 'do'ブロックが十分大きければ、内部の名前空間を汚染することを心配する必要があります。とにかく、 。 :] –
ええ、それも私に起こっていた。私はいくつかの馬鹿が書いた機能的なScalaコード(:-))を、それよりも長い関数で翻訳しています。 – Ralph