FSharp やってみた2
その 2。
add
という関数を定義して、引数を渡して評価してみる:
> let add x y = - x + y;; val add : x:int -> y:int -> int > add 2 2;; val it : int = 4
関数のボディ部分を折ってるけど、インデントしないと Warning が出るので注意。
あと、終了する時は:
> exit 0;;
か:
> #q;;
でできる。
型アノテーション
フレーズを渡したら、leet 語っぽく返してくれる関数を定義してみよう:
> let toHackerTalk phrase = - phrase.Replace( 't', '7' ).Replace( 'o', '0' );; phrase.Replace( 't', '7' ).Replace( 'o', '0' );; --^^^^^^^^^^^^^^ /home/rihine/workspace/hello-fsharp/stdin(4,3): error FS0072: Lookup on object of indeterminate type based on information prior to this program point. A type annotation may be needed prior to this program point to constrain the type of the object. This may allow the lookup to be resolved.
エラーになった。
どうやら、引数 phrase
が object
っぽく解釈されてるものの、object
には当然 Replace()
なんてメソッドはないわけで、
そんなもん無いよって言ってるらしい。
アノテーションを付けてみるといいらしい:
> let toHackerTalk (phrase:string) = - phrase.Replace( 't', '7' ).Replace( 'o', '0' );; val toHackerTalk : phrase:string -> string
関数は実際、値
ソースコードをファイルに書いて実行することにする。
引数を 4 倍する関数を定義する:
// quadruple.fsx let quadruple x = let double x = x * 2 double ( double x );; printfn "%d" (quadruple 4);;
関数の中で関数を定義できる。という感じ。
普通にファイル名を指定するだけで実行してくれる:
% fsharpi ./quadruple.fsx
16
関数を引数に取る高階関数を使うコード:
// chrisTest.fsx let chrisTest test = test "Chris" ;; let isMe x = if x = "Chris" then "it is Chris!" else "it's someone else" ;; printfn "%A" (chrisTest isMe);;
ラムダ関数
前の add
関数はラムダ式で書くとこう書ける:
> let add = (fun x y -> x + y);; val add : x:int -> y:int -> int
その2:
> let twoTest test = - test 2;; val twoTest : test:(int -> 'a) -> 'a > twoTest (fun x -> x < 0);; val it : bool = false