2016年1月28日木曜日

実戦F# 関数型プログラミング P295

8.15.3 パラメタライズド アクティブパターン

リスト 8-70 を少し変えて、いろいろ試してみた。
let (|Mul|_|) m n = if n%m=0 then Some(n/m) else None;;

let fizzbuzz3 = function
    | Mul 15 nm -> printfn("FizzBuzz  15で割ると%d") nm
    | Mul 3 nm -> printfn("Fizz 3で割ると%d") nm
    | Mul 5 nm -> printfn("Buzz 5で割ると%d") nm
    | n -> printfn("%d") n;;

fizzbuzz3 30;;
FizzBuzz 15で割ると2

nが入力となるようだ。nmのところが、Someの中身になるようだ。

つぎに、入力を表示するためにつぎのようにしてみた。
let fizzbuzz2 input =
 match input with
    | Mul 15 nm -> printfn("%d is FizzBuzz") input
    | Mul 3 nm -> printfn("%d is Fizz") input
    | Mul 5 nm -> printfn("%d is Buzz") input
    | input -> printfn("%d") input;;

fizzbuzz2 3;;
3 is Fizz

いずれにしても、
let (|Mul|_|) m n   ①
では、引数の最後のnが入力と考え、let (|Mul|_|) mまでがカリー化した?関数とみなしているようだ。
そして、Mul 15 nm ②
のMul 15にinputや入力を適用し、結果がnmに返り値となって表れる。ということのようだ。入力と返り値が、①でも②でも最後の項だけれど、①では入力 ②までは出力 となっているところが まぎらわしい。

アクティブパターンは、F#独自の機能のようだけれど、うまく活用するとプログラムが
簡潔になるらしい。書籍を読むだけでなく、実際に、いろいろ試してみたほうが理解しやすいようだ。

0 件のコメント:

コメントを投稿