関数型言語F#のラムダ計算で引き算ができません

はじめに

関数型プログラミング言語は、ラムダ計算という仕組みが元になっているというのをよく入門記事で見かけます。実際にラムダ計算を調べてみると基本ルールはとても小さく、関数だけで数字や演算子を作り上げる面白い仕組みというのが分かりました。

また、F#やHaskellは文法上、括弧が少なくカリー化で引数がひとつずつ繋がっているのでラムダ計算の表記をF#にとても落とし込みやすかったです。たぶんHaskellも同じようにやりやすいのだと思います。私のスキルはFizzBuzzを書くぐらいのレベルですが、興味のある事をしないと命令型言語に戻ってしまうのでF#でラムダ計算をやるだけやってみました。

問題点

以下ソースコードは、https://en.wikipedia.org/wiki/Church_encoding を参考に書きました。コードの次に書いてあるエラーのように、型が一致しませんの表記がすごいことになっていて、とても解決できるものではありません。

ソースコード

 

 

型が一致しませんエラーが解決できません。

66行目、let test021() = minus n2 n2のコメントアウトを外すと型が一致しません。というエラーが発生します。

 

いろいろ調べてみる

“F# lambda calculus”などで検索すると、”A Lambda Calculus AST”などが見つかるので、こういうソースを追いかけてみるもの良いのかもしれません。pureというプログラミング言語だと近い表記で実装できそう。

Haskellでもエラーがでる?

  • http://d.hatena.ne.jp/mokehehe/20080202/lambda
  • http://d.hatena.ne.jp/katona/20100615/p1
  • http://d.hatena.ne.jp/katona/20100427/p1
  • https://uid0130.blogspot.jp/2013/05/x.html

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA