【问题标题】:What's the best way of expressing a "never-evaluated" argument to a function in type?向类型中的函数表达“从未评估”参数的最佳方式是什么?
【发布时间】:2026-01-28 15:35:01
【问题描述】:

对不起标题,我不知道有没有更好的方式来用一句话来描述它。

我的想法是我想要一个函数类型来表示该函数接受一个参数但永远不会评估它。

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

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

  1. f :: forall a . a -> Int,喂f 什么都行
  2. f :: () -> Int,只有一个微不足道的价值需要评估
  3. f :: Void -> Int,这可能是个坏主意,因为 f = absurdf 可能与 undefinedlet x = x in x 一起应用,但如果您知道 f 终止,那么您也知道它永远不会评估它的论点。
  4. 不知道有没有其他的方法,有的话请给点建议。

关于为什么我首先需要这样的函数:假设我想设计一个流处理库并让流处理器的类型类似于SP <input-type> <output-type>,并且处理器可能不需要任何输入。在某些时候,如果我想让它成为Arrow,我将不得不处理像<input-type> -> <output-type> 这样的函数。

【问题讨论】:

标签: haskell


【解决方案1】:

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

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

【讨论】:

    最近更新 更多