リスト 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;;
3 is Fizz
いずれにしても、
let (|Mul|_|) m n ①
では、引数の最後のnが入力と考え、let (|Mul|_|) mまでがカリー化した?関数とみなしているようだ。
そして、Mul 15 nm ②
のMul 15にinputや入力を適用し、結果がnmに返り値となって表れる。ということのようだ。入力と返り値が、①でも②でも最後の項だけれど、①では入力 ②までは出力 となっているところが まぎらわしい。
アクティブパターンは、F#独自の機能のようだけれど、うまく活用するとプログラムが
簡潔になるらしい。書籍を読むだけでなく、実際に、いろいろ試してみたほうが理解しやすいようだ。
0 件のコメント:
コメントを投稿