7

OCaml や F# では、次の形式で連続した let バインディングを使用するのが一般的です。

let a1 = ...
let a2 = ...
let a3 = ...
let f1 = ...
let f2 = ...
let f3 = ... 
f3 a1 a2 a3

多くの場合、これらの let バインディングの一部 (上記の例のf1f2など) は、その直後の式または関数のビルディング ブロックとしてのみ使用され、後で再度参照されることはありません。他の場合では、いくつかの値が実際に「チェーン」の最後で使用されます (たとえば、上記の例ではa1a2、およびa3 )。これらのスコープの違いを明確にする構文イディオムはありますか?

4

2 に答える 2

7

jrouquie の回答に加えて、関数合成やその他のコンビネータを適切に使用することで、中間値に名前を付けるのを避けることができます。Batteriesが提供する次の 3 つが特に気に入っています。

# let ( |> ) x f = f x;;
val ( |> ) : 'a -> ('a -> 'b) -> 'b = <fun>
# let ( |- ) f g x = g (f x);;
val ( |- ) : ('a -> 'b) -> ('b -> 'c) -> 'a -> 'c = <fun>
# let flip f x y = f y x;;
val flip : ('a -> 'b -> 'c) -> 'b -> 'a -> 'c = <fun>

を使用した小さな例|>

# [1;2;3]
  |> List.map string_of_int
  |> String.concat "; "
  |> Printf.sprintf "[%s]";;
- : string = "[1; 2; 3]"

より現実的な例が必要|-になります。flipこれは、ポイントフリーまたは暗黙のプログラミングとして知られています。

于 2012-08-09T13:42:47.337 に答える