是否可以提供類型簽名給Haskell值,其中包含用於填充類型推斷算法的「空白」?你可以部分限制Haskell中的類型嗎?
上下文極度做作的例子:
m = return ('I', (("don't", "really"), "care", ["what", "this"], "type"), "is")
b = isJust m
這工作。在b
使用isJust m
約束是Maybe <something>
的m
類型,以及m
的定義約束的m
類型爲<something> (Char, ((String, String), String, [String], String), String)
,並且編譯器放在一起的那些信息兩塊制定出的精確類型的m
。
但是,說我沒有將任何Maybe
特定功能應用到m
,所以我需要一個手動類型簽名來停止return
多態。我不能這樣說:
m :: Maybe a
m = return ('I', (("don't", "really"), "care", ["what", "this"], "type"), "is")
因爲這是不正確的。該類型不是Maybe a
對於所有的a
,它是Maybe a
對於一些a
我希望編譯器能夠推斷;編譯器有足夠的信息來做到這一點,我們可以從我的第一個例子中看到,編譯器是能夠將類型上的多個約束集中在一起,其中沒有單獨的約束就足以找出什麼類型只是在一起,他們完全指定了類型。
我想要的是能夠給類型,如m :: Maybe _
,其中_
表示「搞清楚到這裏」,而不是「這是一個剛性類型變量」,如m :: Maybe a
。
有沒有某種方式來說這樣的事情?
m :: Maybe (Char, ((String, String), String, [String], String), String)
m = return ('I', (("don't", "really"), "care", ["what", "this"], "type"), "is")
或者到具有約束類型簽名的Maybe
一部分,但不是a
一樣的效果表達的一部分,給人一種類型簽名:我可以看到明確給出全部類型的選擇:
m = (return :: a -> Maybe a) ('I', (("don't", "really"), "care", ["what", "this"], "type"), "is")
或離開m
沒有一個明確的類型簽名,並引入其約束m
未使用額外的定義:
m = return ('I', (("don't", "really"), "care", ["what", "this"], "type"), "is")
b = isJust m
或者直接使用單態功能:
m = Just ('I', (("don't", "really"), "care", ["what", "this"], "type"), "is")
顯然,這是不特定於Maybe
,也不至* -> *
類型構造函數的參數;我可以想象,如果不想說「這個值是一個monadic Int
,對於一些monad」而不想說「這個值是單子Int
對於任何 monad」,或者「這是一個從Int
到某些其他類型的函數」說:「這是從Int
到任何其他類型的功能。
我最感興趣的是,是否有一些東西可以讓我直接聲明上述關於值的聲明,以便於閱讀,而不是難以閱讀解決方法(如爲return
提供明確的類型簽名)。我知道如果我的目標是簡單地向編譯器中獲取額外的輸入信息來關閉模糊類型變量,那麼有無數的方法可以做到這一點。
[不完整類型簽名]的可能重複(http://stackoverflow.com/questions/11751318/incomplete-type-signature) – hammar
不是[洞](http://hackage.haskell.org/trac/ ghc/wiki/Holes)究竟是否解決了這個問題? – is7s
@ is7s在程序真正起作用之前,仍然需要填充空洞,我認爲對於Haskell來說,它們實際上只是term-level,而不是這裏所需的類型級別。 –