簡體   English   中英

在Haskell中實現Read類型類的實例

[英]Implementing instance of Read typeclass in haskell

我一直在處理歸納類型(定義的自然數和算術運算),但我無法讓Haskell讀取函數起作用。

這是我的代碼:

data Natural = Zero | Succ Natural
    deriving (Eq, Ord)

instance Enum Natural where
    pred Zero = undefined
    pred (Succ x) = x

    succ x = Succ x

    toEnum 0 = Zero
    toEnum x = Succ (toEnum (x - 1))

    fromEnum Zero = 0
    fromEnum (Succ x) = fromEnum x + 1

instance Num Natural where
    (+) x Zero = x
    (+) x (Succ y) = Succ (x + y)

    (-) Zero (Succ x) = undefined
    (-) x Zero = x
    (-) (Succ x) (Succ y) = x - y

    (*) x Zero = Zero
    (*) x (Succ y) = x * y + x

    abs x = x

    signum Zero = Zero
    signum (Succ x) = Succ Zero

    fromInteger 0 = Zero
    fromInteger x = Succ (fromInteger (x - 1))

instance Show Natural where
    show x = show $ fromEnum x

-- Not working!

instance Read Natural where
    readsPrec x = fromInteger $ (read x) :: Integer

我希望這個表達式是有效的: naturalNumber = read someStringWithInteger :: Natural ,所以我不能只是派生Read類型類。

我嘗試使用readsPrecreadPrec ,但是我只會得到不匹配的類型錯誤。

如何實現Read類型類的實例?

您的函數類型錯誤。 您的readsPrec類型為readsPrec String -> Natural ,而您應該使用readsPrec String -> Natural readsPrec Int -> String -> [(Natural, String)] 但是我們可以調整一下:

readsPrec p s = [(fromInteger i, s') | (i, s') <- readsPrec p s]

這使用IntegerreadsPrec函數。 由於您想閱讀Integer因此使用它很方便。

出於對稱性原因,我建議您實現showsPrec而不是在Show實例中使用show

暫無
暫無

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

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