什么是表达"永不评估"的最佳方式。类型函数的参数?

时间:2016-11-15 19:35:16

标签: haskell

对标题感到抱歉,我不知道是否有更好的方法可以用一句话来形容它。

我的想法是希望函数类型表示函数接受一个参数但永远不会对它进行评估。

我能想到的选择很少,而且我想知道什么是最好的选择:

(对于以下所有示例,Int只是任何具体类型的任意选择)

  1. f :: forall a . a -> Int,向f提供任何可以做的事情
  2. f :: () -> Int,除了要评估的微不足道的价值之外别无他法
  3. f :: Void -> Int,这可能是一个坏主意,因为f = absurdf适用于undefinedlet x = x in x,但如果你知道f终止,那么你也知道它永远不会评估它的论点。
  4. 我不知道是否有其他方式,请提出您的建议。
  5. 关于为什么我首先需要这样的函数:假设我想设计一个流处理库并让流处理器的类型像SP <input-type> <output-type>那样处理器可能没有& #39; t需要任何输入。在某些时候,如果我想将<input-type> -> <output-type>作为Arrow,我必须处理{{1}}这样的函数。

1 个答案:

答案 0 :(得分:6)

第一个是完美的。它将接受任何类型的参数,因此您在提供它时具有最大的灵活性(甚至undefined)。 #2将您限制为只有一个有效参数()。 #3不是一个选择;你甚至不能调用函数,因为没有有效的参数来提供它。

这正是const :: a -> b -> a返回的内容。 foo = const 3是一个函数,它接受任何类型的值并返回3