0

私はFPの経験はあまりなく、もっと精通した人からの重要な洞察を欠いていると思います。私は、小さな、埋め込まれた、機能的で、厳密にそして不変的に型付けされた言語を書いています。ブール演算子の関数の構成

この質問では、私はハスケルのような構文を使用します。

次の署名は、あなたが期待するものですタイプと事前に定義された機能のためのものです:

and :: bool -> bool -> bool -- boolean and 
lt :: int -> int -> bool -- less than 
gt :: int -> int -> bool -- greater than 
len :: list -> int   -- list length 

私の仕事は、次のシグネチャを持つ式を形成するために、これらの機能(および定数)を構成することです。

(現在)この言語のみをサポート:の
λ :: list -> bool 

結果は、リストの長さ

1〜99の制約を有するかどうかであります機能のアプリケーションと機能の構成。ラムダ式はなく、高次関数はありません。それの長さは、ブール、その後、0より大きく、「と」の両方の引数を返した場合、

and . ((gt 0) . len) :: list -> bool -> bool 

これはリストを受け取りチェック:

これは私が得ているどのくらいです。

しかし、今私は立ち往生しています。ここから伝統的な機能的言語でどのように続行しますか?ラムダ/クロージャなしでソリューションを表現する方法はありますか?

私は言語に新しい機能を追加することはできますが、機能が低下していてシンプルである限りです。

+0

ハスケルでは 'f x =((gt 0)len x)&&((lt 100)len x)'と書くことができます。あなたはあなたの言語でそれを受け入れますか? –

+0

「高次関数なし」とはどういう意味ですか? – leftaroundabout

+0

@leftaroundについては、引数として他の関数をとる関数はありません。 – thwd

答えて

2

これは、pointfree styleと呼ばれ、Haskellコードを変換するためにウェブ上にnice toolがあります。 f xs = (length xs > 0) && (length xs < 100)を変換するとf = ap ((&&) . (> 0) . length) ((< 100) . length)となります。したがって、ちょうどap関数がありません(Understanding `ap` in a point-free function in Haskellも参照)。アプリケーションにはタイプ(a -> b -> c) -> (a -> b) -> (a -> c)があり、.と一緒に組み込む必要があります。

関連する問題