在函数式语言中,您从函数中返回的未指定(变量)类型基本上必须出现在您传递的类型中的某处,否则值会从何处来?因此,没有(有用的)功能类型'a -> 'b.
这可能有助于考虑您希望传递给函数的类型,以及提取函数如何与它们关联。应该可以有一个相当直接的关系。与类型系统打架通常意味着你正在尝试做一些可能意外失败的事情,这就是类型系统试图阻止的事情。
编辑:
也许我想说的是,'a
和'b
,输入和输出类型的提取功能,都不会是任意类型。输入类型'a
可能与'c
类型有关。类似地,结果类型'b
可能与整个函数xxx
的返回类型有关。没有关于这些关系的更多信息,很难提出建议。
如果您尝试将它们视为独立的任意类型,那么您会遇到上面讨论的参数不可能性问题。 (它也需要高级分类,我认为它是2级多态性)。
作为一个简单的例子,说'a
和'c
是相同的类型,而'b
是该函数的返回类型。那么你的功能几乎必须看起来像这样:
let xxx ?extractor s =
match extractor with
| Some f -> f s
| None -> s
这有你想要的行为:默认提取函数是标识函数。但是这也迫使返回类型f
与其输入类型相同。因此XXX的类型是:
val xxx : ?extractor:('a -> 'a) -> 'a -> 'a
除非你想获得极其花哨,没什么解决这个没办法了,我怀疑一个奇特的解决方案将提出一份超过具有可选参数的便利性复杂性。
也许它会工作有两个功能。要继续简化的例子,他们是这样的:
# let xxx extractor s = extractor s;;
val xxx : ('a -> 'b) -> 'a -> 'b = <fun>
# let xxx_id s = xxx (fun x -> x) s;;
val xxx_id : 'a -> 'a = <fun>
我觉得这有你想要的类型,唯一的不便是,你有两个不同的名字。
'所以没有(有用的)类型'a - >'b.'的功能 - 有一个非常有用的魔术功能(但我不会在这里称呼它!):) – ygrek
我知道这个函数,我只是认为它在语言之外(从某种意义上说)。 –
同意了,这更像是一个笑话 – ygrek