【发布时间】:2018-10-12 21:49:10
【问题描述】:
我正在阅读Haskell Programming from First Principles一书,newtype 章节中有一个练习,要求我为(Num a, TooMany a) => (a, a) 创建一个TooMany 实例。
之前的练习已经为Int、Goats Int、(Int, String) 和(Int, Int) 创建了TooMany 实例。我已经完成了这些,但不是为(Num a, TooMany a) => (a, a)。
所有代码如下:
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE FlexibleInstances #-}
class TooMany a where
tooMany :: a -> Bool
instance TooMany Int where
tooMany n = n > 42
newtype Goats = Goats Int deriving (Eq, Show, TooMany)
-- the following needs FlexibleInstances pragma
instance TooMany (Int, String) where
tooMany (n, _) = n > 33
-- or do this:
newtype AnotherTooMany = AnotherTooMany (Int, String) deriving (Eq, Show, TooMany)
instance TooMany (Int, Int) where
tooMany (n, m) = (n + m) > 44
-- THE FOLLOWING ONES ARE NOT CORRECT !!!
instance TooMany (Num a, TooMany a) => (a, a) where
tooMany (t1, t2) = (t1 + t2) > 44
newtype YetAnotherTooMany =
YetAnotherTooMany (Num a, TooMany a) => (a, a)
deriving (Eq, Show, TooMany)
我应该如何更改最后两个表达式以使其正常工作?
我也参考了以下问题,但还是没有找到答案:
【问题讨论】:
-
instance (Num a, TooMany a) => TooMany (a, a)?