x = globalCounter <- globalCounter + 1 printfn "Call count: %d" globalCounter x + globalCounter // 型: int -> int // ファイルIOを含む関数 let saveAndAdd filename x y = let result = x + y File.WriteAllText(filename, string result) result // 型: string -> int -> int -> int 13
option let firstTwo list = match list with | x :: y :: _ -> Some (x, y) | _ -> None // 'a * 'b -> 'b * 'a let swap (x, y) = (y, x) オブジェクト指向の範囲では、型に基づく 名前解決になる // コンパイルエラー: レシーバーの型が不明 let getLength x = x.Length let lambda = fun x -> x.Length // 型注釈をつければOK let getLength (x: string) = x.Length let lambda = fun (x: string) -> x.Length // コンパイルエラー: 引数の型が不明 let parse x = System.Int32.Parse(x) 23
x + y // ^a -> ^b -> 'c when (^a or ^b) : (static member (+) : ^a * ^b -> 'c) module MyList = let inline sum xs = List.fold (+) LanguagePrimitives.GenericZero<_> xs;; // ^a list -> ^b // when (^b or ^a) : (static member (+) : ^b * ^a -> ^b) // and ^b: (static member Zero: ^b) 44
s g | extend s g duplicate x Monoid zero (+) x y {Appends both monoids} Seq.sum x Functor map f x unzip x Contravariant contramap f x Applicative return x ( < * > ) f x map f x lift2 f x y Alternative empty ( < | > ) f x mfilter p x ZipApplicative pur x ( < . > ) f x map f x map2 f x y Monad return x ( > > = ) x f map f x join x Bifunctor bimap f g x first f x second f x Foldable toSeq x Bifoldable bifoldMap f g x bifold f g z x bifoldBack f g x z bisum x Traversable traverse f x sequence x Bitraversable bitraverse f x bisequence x Profunctor dimap f g x lmap f x rmap f x Category catId ( < < < ) f g ( > > > ) f g Arrow arr f arrFirst f g arrSecond f g (***) f g (&&&) f g 47