对标题感到抱歉,我不知道是否有更好的方法可以用一句话来形容它。
我的想法是希望函数类型表示函数接受一个参数但永远不会对它进行评估。
我能想到的选择很少,而且我想知道什么是最好的选择:
(对于以下所有示例,Int
只是任何具体类型的任意选择)
f :: forall a . a -> Int
,向f
提供任何可以做的事情f :: () -> Int
,除了要评估的微不足道的价值之外别无他法f :: Void -> Int
,这可能是一个坏主意,因为f = absurd
和f
适用于undefined
或let x = x in x
,但如果你知道f
终止,那么你也知道它永远不会评估它的论点。关于为什么我首先需要这样的函数:假设我想设计一个流处理库并让流处理器的类型像SP <input-type> <output-type>
那样处理器可能没有& #39; t需要任何输入。在某些时候,如果我想将<input-type> -> <output-type>
作为Arrow
,我必须处理{{1}}这样的函数。
答案 0 :(得分:6)
第一个是完美的。它将接受任何类型的参数,因此您在提供它时具有最大的灵活性(甚至undefined
)。 #2将您限制为只有一个有效参数()
。 #3不是一个选择;你甚至不能调用函数,因为没有有效的参数来提供它。
这正是const :: a -> b -> a
返回的内容。 foo = const 3
是一个函数,它接受任何类型的值并返回3
。