[英]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類型類。
我嘗試使用readsPrec
和readPrec
,但是我只會得到不匹配的類型錯誤。
如何實現Read類型類的實例?
您的函數類型錯誤。 您的readsPrec
類型為readsPrec
String -> Natural
,而您應該使用readsPrec
String -> Natural
readsPrec
Int -> String -> [(Natural, String)]
。 但是我們可以調整一下:
readsPrec p s = [(fromInteger i, s') | (i, s') <- readsPrec p s]
這使用Integer
的readsPrec
函數。 由於您想閱讀Integer
因此使用它很方便。
出於對稱性原因,我建議您實現showsPrec
而不是在Show
實例中使用show
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.