研究这本书Haskell Programming from First Principles,我在第6章“Typeclasses”中遇到了以下练习:
-- Hint: use some arithmetic operation to
-- combine values of type 'b'. Pick one.
arith :: Num b => (a -> b) -> Integer -> a -> b
arith = ???
我提出了以下解决方案,我将其称为“解决方案”,因为它编译:
arith f _ x = f x
但是我有点困惑如何“解释”我刚才写的内容。我对arith
类型签名的“阅读”类似于以下内容:
arith
需要一个函数,一个Integer
,一个a
类型的参数, 并返回类型为b
的结果;而且,这个功能arith
作为第一个参数是一个带a的函数 类型为a
的参数,并返回类型b
的值和该值 必须是b
类型,其类型类由Num
为(或“约束”)。
之后,我想出了上面的“解决方案”,但我没有使用“一些算术运算来组合类型'b'的值”。不知怎的,我认为要么“提示”有误导性,要么完全没问题,而且我错过了一些东西,如果是这样,那么我错过了什么?
答案 0 :(得分:7)
我认为预期解决方案是:
arith f i a = f a + fromInteger i
或+
替换为-
或*
的人。
回顾要求:在本练习中,您必须实现以下功能:
匹配类型签名arith :: Num b => (a -> b) -> Integer -> a -> b
。
使用算术运算组合b
类型的值。
您会获得三种(a -> b)
,Integer
和a
类型的值。首先,您需要将它们转换为两个b
类型的值。您可以通过将(a -> b)
应用于a
来获得第一个。然后,您将获得Integer
类型的值。当notice类型Num
的实例支持函数fromInteger :: Integer -> a
(其中类型a
在我们定义的函数的上下文中类型b
时),它变得清晰通过将b
应用于fromInteger
值,您可以获得Integer
类型的第二个值。第二步,使用b
类型类中定义的算术运算之一组合两个类型Num
的值。