2016-11-15 10 views
2

タイトルについて申し訳ありませんが、短い文章で説明する方が良いかどうかはわかりません。型の関数に「決して評価されない」引数を表現する最善の方法は何ですか?

アイデアは、関数が1つの引数を受け入れてもそれを評価しないことを表現する関数型が必要です。

あり私は考えることができるいくつかの選択肢がある、と私は最高のものであろうかを知りたい:

(以下のすべての例については、Intは、任意の具体的な種類からわずか任意の選択である)

    は、
  1. f ::() -> Intを尽くすものとf
  2. f :: forall a . a -> Int は、些細な値は
  3. f :: Void -> Int
  4. を評価しなければ何もありません f = absurdfには undefinedまたは let x = x in xが適用される可能性がありますが、 fが終了することがわかっている場合は、その引数が評価されないこともわかります。
  5. 他の方法があるかどうかわかりませんが、もしあればあなたの提案をしてください。私は最初の場所でこのような機能を必要とする理由について

:私は、ストリーム処理ライブラリを設計し、ストリームプロセッサの種類がSP <input-type> <output-type>ようになるようにしたいと仮定し、それは、プロセッサは、任意の入力を必要としないことも可能です。これをArrowにしたい場合は、ある時点で<input-type> -> <output-type>のような関数を処理する必要があります。

+1

これはおそらく関連しているでしょう:[*]なぜ、未使用の入力を閉じるためにHaskell Pipesが "use()"を使用し、未使用の出力を閉じるためにX(無人型) "?*](http://stackoverflow.com/q/35161616/ 2751851) – duplode

+0

リンクのおかげで@duplode、私は '()'と 'Void'の選択の理由を理解しようとしていたので、それは重要です。 – Javran

答えて

6

最初は完璧です。任意の型の引数を受け入れるので、提供するものに最大限の柔軟性があります(undefinedも)。 #2は有効な引数である()を1つに制限します。 #3はオプションではありません。 関数を呼び出すこともできません。なぜなら、それを与える有効な引数がないからです。

これはまさにconst :: a -> b -> aが返すものです。 foo = const 3は、任意の型の値をとり、3を返す関数です。

関連する問題