簡體   English   中英

在Haskell中,我可以默認使數字文字不是多態的嗎?

[英]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類型的參數(實際上,即使這不是必需的,但如果不是這樣,你將從數字文字中獲得類型錯誤)。

請注意,因為標准fromIntegerNum類的一部分,所以您可能需要破解一些東西以使事情正常工作。

我想我應該在這些答案中添加“default()”,盡管我認為gatoatigrado順便提到了它。 Haskell的98標准具有部分4.3.4最終說明如何改變貨號一個=>一值的一些違約。 隱含的違約順序由下式給出

 default (Integer, Double)

並且可以改變,例如通過推桿

 default (Int)

要么

 default ()

在源文件中。

暫無
暫無

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

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