[英]Haskell: expression of “generic” type
在類似的問題,因為一個表現出這個問題 ,是有可能有“通用”類型的Haskell的表達? 就像是,
myExpression :: a
我是Haskell的新手,但從我一直看到的情況來看,這是無法實現的。
不,除了底層,沒有什么可以滿足的,例如
myExpression = myExpression
-- or,
myExpression = undefined
是否有任何合理的方式,它可能呢? 一些既是Integer
又是Maybe (String -> IO ())
類型的非底部表達式(例如, Maybe (String -> IO ())
)。
此外,由於你提到的問題一個答案,證明,與類型簽名唯一的非底層函數, a -> a
是id
,我們有一個證明,不能有非底表達類型a
。 如果有的話
f _ = myExpression
可能具有a- a -> a
類型,這既不是id
也不是bottom,即矛盾。
您可以將類型簽名讀為“對於所有類型a ,myExpression為類型a ”。 這意味着myExpression必須是所有類型中都存在的某個值。
從數學上講,不存在這樣的值,因為a可能是“ Badgers”或“不是badge的東西”,並且這兩個集合必然是不同的。
在Haskell類型系統中,myExpression唯一有效的值是undefined ,即bottom。
雖然抽象地只有一個值的類型為“ a”,但底部在運行時有多種可能的解釋。
myExpression = myExpression
這將永遠不會終止。
myExpression = undefined
(使用GHC時)將打印“ *例外:Prelude.undefined”
myExpression = error "Hello!
這將打印“ *例外:您好!”
myExpression = unsafePerformIO (launchNukes >> fail "BOOM")
此版本的bottom的行為取決於您導入的庫。
由於您詢問的是“泛型”類型,因此可能意味着可以有用地包含任何值的事物的類型。 在這種情況下,請看一下Data.Dynamic ,它使您可以將具有內存表示形式的任何內容轉換為“ Dynamic”類型的值。 稍后,當使用類型為“動態”的值時,可以嘗試將其轉換為更具體的類型,以便實際使用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.