簡體   English   中英

如何確定是否可以編寫一個給定類型的完整的終止 Haskell 函數?

[英]How to determine if one can write a total, terminating Haskell function given a type?

給定一個類型,確定您是否可以編寫一個完整的、終止的 Haskell 函數。

對於像Int -> Int這樣的類型,我們知道有限精度整數類型 Int 至少覆蓋了范圍[-2^29, 2^29-1]所以我們可以從 Int 到 Int 有很多可能的映射所以我們可以寫一個完整的終止函數。

例如,給定以下類型: (a -> b) -> (b -> c) -> (a -> c) ,我如何確定我們是否可以編寫使用該類型作為函數的總終止函數簽名? 或者這種類型(a -> c) -> ((a, b) -> c)

將不勝感激通過這個問題的指導! 這是一個家庭作業問題,所以我只是在尋求指導。

鑒於:

(a -> b) -> (b -> c) -> (a -> c)

我們知道這不一定是 Curry-Howard 對應關系的一部分——將->解釋為邏輯含義,乘積類型為 AND,和類型為 OR——我們發現它形成了重言式。 但是為了找到一個實現並知道它是 total ,我們需要實際找到證明:

   (a → b) → (b → c) → a → c
-- ~~~~~~~~~~~~~~~~~~~~~~~~~
-- currying
-- ~~~~~~~~~~~~~~~~~~~~~~~~~
   (a → b) ∧ (b → c) → a → c
--           ~~~~~~~~~~~~~~~
-- currying
--           ~~~~~~~~~~~~~~~
   (a → b) ∧ (b → c) ∧ a → c
-- ~~~~~~~~~~~~~~~~~
-- commutativity of AND
-- ~~~~~~~~~~~~~~~~~
   (b → c) ∧ (a → b) ∧ a → c
--           ~~~~~~~~~~~
-- modus ponens
--           ~
   (b → c) ∧ b → c
-- ~~~~~~~~~~~
-- modus ponens
-- ~
   c → c
-- ~~~~~
-- reflexivity of implication
-- ~
   1

(這是一個假設的三段論。)

我們可以使用這個證明來實現一個實現——跳過這里的柯里化步驟,並使用對應於函數應用程序的模式

f ab bc a = bc (ab a)

對於(a -> c) -> ((a, b) -> c)(a, b)解釋為a ∧ b (邏輯與) (a, b)該論證是類似的。

部分答案:

對於有限數據類型,例如您提到的IntBool (我猜可以包含所有 Bounded )。 那么是的,你可以提供一個完整的功能:

如果您有時間涵蓋Int所有情況:

negative :: Int -> Int
negative 0 = 0
negative 1 = -1
negative 2 = -2
negative 3 = -3
...............
...............
negative -1 = 1
negative -2 = 2
...
...
...

直到您涵蓋所有情況......這只是一個例子。

使用Bool更明顯一點,您可以:

negative :: Bool -> Bool
negative False = True
negative True  = False

但是,對於接受函數的函數,它們被稱為Uncontable set ,因此您可以提供所有可能的函數組合,因此它永遠不會結束,您總會找到函數函數的另一個“層次”,它是一個“更大的無限” ”比納茲設定。

主要問題:

如何確定是否可以編寫一個給定類型的完整的終止 Haskell 函數?

(a -> b) -> (b -> c) -> (a -> c)(a -> c) -> ((a, b) -> c)也許你可以提供一個.

但是關於:

(a -> b -> c -> d -> e) -> (b -> c) -> (a -> c) -> (d -> e)

我只能肯定地說,您不能保證您會為所有類型的所有組合至少找到至少一個 但是@Jon Purdy 很好地回答了如何

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM