簡體   English   中英

Haskell:“通用”類型的表達

[英]Haskell: expression of “generic” type

在類似的問題,因為一個表現出這個問題 ,是有可能有“通用”類型的Haskell的表達? 就像是,

myExpression :: a

我是Haskell的新手,但從我一直看到的情況來看,這是無法實現的。

不,除了底層,沒有什么可以滿足的,例如

myExpression = myExpression

-- or,

myExpression = undefined

是否有任何合理的方式,它可能呢? 一些既是Integer又是Maybe (String -> IO ())類型的非底部表達式(例如, Maybe (String -> IO ()) )。


此外,由於你提到的問題一個答案,證明,與類型簽名唯一的非底層函數, a -> aid ,我們有一個證明,不能有非底表達類型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.

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