OCamlのfold_left, fold_rightはF#ではfold, foldBackになってますよ、という話

気がつかなくて一生懸命探していたのですよ。F#でOCaml互換のメソッドを呼び出す方法を紹介します。

前提

を利用しております。その他の環境では確認しておりませんのでご了承下さい。

F# PowerPack

F# PowerPackはFSharp.Core.dllライブラリを補完するライブラリ・ツール群です。
非常に強力なライブラリで、例えば、

  • パーサー生成ツール(FSLex.exe, FSYacc.exe)
  • OCaml互換ライブラリ(FSharp.PowerPack.Compatibility.dll)
  • LINQサポートライブラリ(FSharp.PowerPack.Linq)

といった機能があります。
本日はF# PowerPackのOCaml互換ライブラリを紹介します。

F# PowerPackはFSharp.Coreライブラリから"切り離された"ライブラリであるため、
別個インストールする必要があります。
上記CodePlexからインストーラでもzipでも良いのでダウンロードしてインストールしてください。

参照を追加するライブラリ名は

  • FSharp.PowerPack
  • FSharp.PowerPack.Compatibility

です。
OCaml互換ライブラリのモジュール名は

です。
これでOCamlライブラリを使う準備は整いました。

例えばこんな風に使えます。

open System
open Microsoft.FSharp.Compatibility.OCaml

let sum = List.fold_left (+) 0 [1; 2; 3; 4; 5]
let rev = List.fold_right (fun x acc -> x :: acc) [1; 2; 3; 4; 5] []

このソースを打ち込んでいただくと解るのですが、OCaml互換ライブラリのメソッドはIntelliSenseが効きません。
IntelliSenseに頼り切った私は、気付くのに時間がかかりました。

さらにビルドするとこんな警告が出ます。

  • 警告 FS0062: This construct is for ML compatibility. This F# library function has been renamed. Use 'fold' instead. This message can be disabled using '--nowarn:62' or '#nowarn "62"'.
  • 警告 FS0062: This construct is for ML compatibility. This F# library function has been renamed. Use 'foldBack' instead. This message can be disabled using '--nowarn:62' or '#nowarn "62"'.

これはそのままですね。
メソッドより前のソースコードに#nowarn "62"と記述するか、
ビルドオプション([プロジェクト]を右クリック->[プロパティ]->[ビルド]->[その他フラグ])に--nowarn:62と記述すれば警告は消えますよ。