我正在阅读来自第一原理的 Haskell Programming 一书,本章中有一个练习newtype,要求我TooMany为(Num a, TooMany a) => (a, a).
之前的练习已经为、和提供了TooMany实例。我已经完成了这些,但不是为了.IntGoats Int(Int, String)(Int, Int)(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)
我应该如何更改最后两个表达式以使它们起作用?
我还提到了以下问题,但仍然没有找到答案: