okmij.org的Oleg对此有一个实现。这里有一个简短的介绍,但有文字的 Haskell 源代码包含该过程的详细信息和描述。(我不确定这与 Djinn 掌权有何对应,但这是另一个例子。)
在某些情况下没有唯一功能:
fst', snd' :: (a, a) -> a
fst' (a,_) = a
snd' (_,b) = b
不仅如此;在某些情况下,函数的数量是无限的:
list0, list1, list2 :: [a] -> a
list0 l = l !! 0
list1 l = l !! 1
list2 l = l !! 2
-- etc.
-- Or
mkList0, mkList1, mkList2 :: a -> [a]
mkList0 _ = []
mkList1 a = [a]
mkList2 a = [a,a]
-- etc.
(如果你只想要总函数,那么考虑[a]
限制为无限列表list0
等list1
,即data List a = Cons a (List a)
)
事实上,如果你有递归类型,任何涉及这些的类型都对应于无数个函数。但是,至少在上述情况下,函数的数量是可数的,因此可以创建一个包含所有函数的(无限)列表。但是,我认为该类型[a] -> [a]
对应于无数个函数(再次限制[a]
为无限列表),因此您甚至无法枚举它们!
(总结:有些类型对应于有限、可数无限和不可数无限数量的函数。)