2018年9月23日日曜日

【F#】F# リファレンス

F#始めました。
しかし、市販されている本も少なく、またサイトにある情報も少ないので、
すこしづつ情報をまとめていきたいとおもっています。

【参考URL】
https://docs.microsoft.com/ja-jp/dotnet/fsharp/language-reference/index

1、値(value)と型(type)
F#の値(value)は、特定の型(type)を持つ数量(quantity)です。
値は変更不可ですがが、
キーワード mutable を使用して、変更可能な変数を指定できます。
> let mutable x = 1
> x <- x + 1
 ・・・<-で値変更する
【参考URL】
http://fsharpintro.net/value.html

2、ラムダ式(匿名関数/無名関数)
fun pat1 ... patn -> expr
  funがラムダ式が始まることを示すキーワードで
  exprは様々な式のこと、つまり関数の本体です。
> fun x -> x + 1

関数を適用するための構文は次のようになります。
expr expr | expr(expr)
式全体を括弧で囲む必要がある点です。
> (fun x -> x + 1) 10

今度は引数が2つの関数です。
> ((fun x y -> x + y) 10) 20
> (fun x y -> x + y) 10 20

※返り値:関数本体部分の一番最後の式の値が返り値になります。
> (fun x -> x 10) (fun y -> y + 1)
val it : int = 11

引数の無い関数も定義はつぎのようにします。
> (fun () -> 10) ()
val it : int = 10

3、letを用いた関数定義
let ident pat1 ... patn return-typeopt = bodyexpr
let ident pat1 ... patn return-typeopt = bodyexpr in expr
 identは、定義する関数の名前です。演算子も定義出来ます
 pat1 ... patnは、引数で、匿名関数のところで説明したものと全く同じです
 return-typeoptは、定義する関数の型の注釈で、省略可能です
 bodyexprは関数本体に相当する式です。
> let add x y = x + y //2つの入力をとり、それらを加算する関数
> add 10 20
> let add2 = fun x y -> x + y
> add2 10 20

4、letの構文
let recを用いた関数定義(再起関数)
let rec ident pat1 ... patn return-typeopt = bodyexpr
let rec ident pat1 ... patn return-typeopt = bodyexpr in expr
>let rec fact n =
> if n=1 then
>  1
> else
>  n * fact(n-1)
> fact 5

5、参照型
参照型を使えば、値を変更可能(mutable)にできます。
値を参照型に変更するにはrefを使います。
また、!参照型とすることで、値の参照が、
参照型:=値とすることで値の変更を行うことができます。
let a = ref "hello";;
//aの値を参照
!a ^ " world";;  ---->val it : string = "hello world"
//aの値を変更
a := "hi";;
//aの値を参照
!a ^ " world";;

リストに要素を付加するには、:: (cons) 演算子を使用します。
let pdmList=ref []
pdmList:=pdm:: !pdmList  // := は参照に値を挿入 !pdmListは、pdmListの参照値 ::は結合
let tr=[tr1;tr2;tr3]|>List.max // リスト[tr1;tr2;tr3]を|>演算子を使って、List.maxを実行

6、option型
これを使うと、「値がないか、何かの値がある」ことを表すことが出来ます。
option型のデータを操作するには
パターンマッチを用います。
type 'a option =
 | None  //値がない場合
 | Some of 'a //値がある場合

0 件のコメント:

コメントを投稿