如何解释这种类型检查的Haskell代码?

时间:2016-05-15 22:28:17

标签: haskell typeclass

研究这本书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'的值”。不知怎的,我认为要么“提示”有误导性,要么完全没问题,而且我错过了一些东西,如果是这样,那么我错过了什么?

1 个答案:

答案 0 :(得分:7)

我认为预期解决方案是:

arith f i a = f a + fromInteger i

+替换为-*的人。

回顾要求:在本练习中,您必须实现以下功能:

  1. 匹配类型签名arith :: Num b => (a -> b) -> Integer -> a -> b

  2. 使用算术运算组合b类型的值。

  3. 您会获得三种(a -> b)Integera类型的值。首先,您需要将它们转换为两个b类型的值。您可以通过将(a -> b)应用于a来获得第一个。然后,您将获得Integer类型的值。当notice类型Num的实例支持函数fromInteger :: Integer -> a(其中类型a在我们定义的函数的上下文中类型b时),它变得清晰通过将b应用于fromInteger值,您可以获得Integer类型的第二个值。第二步,使用b类型类中定义的算术运算之一组合两个类型Num的值。