[英]Can I make a polymorphic `mult` function, that takes any numeric type?
[英]In Haskell can I make numeric literals not polymorphic by default?
這可能是不可能的,因為我已經檢查了所有GHC擴展的列表,但這不在那里,但我想我會問以防萬一。
是否有任何方法可以使2
具有類型Int
(或Integer
)而不是通常的Num a => a
?
(我之所以喜歡這種行為,是因為它使得錯誤消息更加清晰,類型推斷更有可能(特別是類型類)。我總是可以寫(2 :: Int)到處但是我寧願“更多安全的“行為是不那么明確的行為”
使用GHC擴展有一種(略顯侮辱和不方便)的方法。
{-# LANGUAGE RebindableSyntax #-}
import qualified Prelude as P
import Prelude hiding (Num(..))
fromInteger :: Integer -> Integer
fromInteger = id
在GHCi中:
> :set -XRebindableSyntax
> :t 2
2 :: Integer
啟用RebindindableSyntax
擴展后,GHC將使用fromInteger
在范圍內處理數字文字。 唯一的限制是它必須采用Integer
類型的參數(實際上,即使這不是必需的,但如果不是這樣,你將從數字文字中獲得類型錯誤)。
請注意,因為標准fromInteger
是Num
類的一部分,所以您可能需要破解一些東西以使事情正常工作。
我想我應該在這些答案中添加“default()”,盡管我認為gatoatigrado順便提到了它。 Haskell的98標准具有部分4.3.4最終說明如何改變貨號一個=>一值的一些違約。 隱含的違約順序由下式給出
default (Integer, Double)
並且可以改變,例如通過推桿
default (Int)
要么
default ()
在源文件中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.