我們可以證明Enumeration a
(主要)是同構列表的列表。 的「同構」是通過以下功能給定:
enumerationToLists :: Enumeration a -> [[a]]
enumerationToLists f = map f [0..]
listsToEnumeration :: [[a]] -> Enumeration a
listsToEnumeration xss i = head $ drop i (xss++empties)
其中:
empties :: [[a]]
empties = []:empties
由於引用透明,我們可以使用「方程式推理」在數學完成,以證明他們確實是形成「同構」
證明listsToEnumeration . enumerationToLists = id
:
(listsToEnumeration . enumerationToLists) f
by definition of .
= listsToEnumeration (enumerationToLists f)
by definition of enumerationToLists
= listsToEnumeration (map f [0..])
by definition of map
= listsToEnumeration [f 0, f 1, f 2, ...]
by definition of listsToEnumeration
= \i -> head $ drop i ([f 0, f 1, f 2, ...]++empties)
concatenation of infinite lists
= \i -> head $ drop i [f 0, f 1, f 2, ...]
by definition of drop and of the argument
= \i -> head $ [f i, f (i+1), f (i+2), ...]
by definition of head
= \i -> f i
eta reduction (i.e. \x -> f x = f)
= f
而現在,鑑於xss = [xs1, xs2, ..., xsN]
和empties = []:empties
,我們有(enumerationToLists . listsToEnumeration) (xss++empties) = xss++empties
(enumerationToLists . listsToEnumeration) (xss++empties)
by definition of .
= enumerationToLists (listsToEnumeration (xss++empties))
by definition of listsToEnumeration
= enumerationToLists (\i -> head $ drop i (xss++empties++empties))
concatenation of infinite lists
= enumerationToLists (\i -> head $ drop i (xss++empties))
by definition of empties
= enumerationToLists (\i -> head $ drop i [xs1, xs2, ..., xsN, [], [], ...])
by definition of enumerationToLists
= map (\i -> head $ drop i [xs1, xs2, ..., xsN, [], [], ...]) [0..]
by definition of map
= let f = (\i -> head $ drop i [xs1, xs2, ..., xsN, [], [], ...]) in [f 0, f 1, ...]
by definition of f
= [head $ drop 0 [xs1, xs2, ..., xsN, [], ...], head $ drop 1 [xs1, xs2, ..., xsN, [], ...], ...]
by definition of drop
= [head [xs1, xs2, xsN, [], ...], head [xs2, ... xsN, [], ..], ..., head [xsN, [],...], head [[], ...], ..]
by definition of head
= [xs1, xs2, ..., xsN, [], [], ...]
by definition of xss, empties and ++
= xss ++ empties
顯然我們假設Enumeration a
是總(應爲「非定義的索引」迴歸[]
)。上面的兩個函數是一個同構,如果我們限制爲無限列表的列表,否則它只能保持「高達++empties
」(如果xss
是無限的,我們有xss = xss++empties
,因爲我們將永遠無法訪問空容器部分)。所以如果你在乎保持這個「同構」,你應該確保你的所有功能都是全部的(看着singleE'
...),但除了這個,它們看起來不錯。
我希望上面的例子給出了關於如何推斷你定義的函數是否正確的提示。
也許你應該至少鏈接到你以前的問題([這一個](https://stackoverflow.com/questions/35684605/function-that-gets-an-int-and-returns-a-list)權利?) - 但取決於你的'imapF'和'singleF'是否正確,這似乎是好的 - 也許你可能會爭辯說,你想返回空單元作爲'singleE''中的其他整數(不是部分),而是這可能取決於您的規格 – Carsten
_correct_是什麼意思?你說的話是有道理的,功能是類型檢查和一切,所以我會說在這裏沒有錯。但要討論它是否是_right_,你需要指定你實際想要達到的目標。 - 我已經說過,這種容器在許多情況下都會表現出低於性能的程度,但對於某些應用程序來說,它可能表現不錯。 – leftaroundabout
@Carsten @leftaroundabout我已經更新了這個問題,使用了plusE的說明和另一個名爲timesE的函數,因爲我覺得我沒有正確理解Enumeration的類型。 –