从第一原理学习Haskell编程一书,我在第6章"Typeclasses"中遇到了以下练习:
-- Hint: use some arithmetic operation to
-- combine values of type 'b'. Pick one.
arith :: Num b => (a -> b) -> Integer -> a -> b
arith = ???
Run Code Online (Sandbox Code Playgroud)
我提出了以下解决方案,我将其称为"解决方案",因为它编译:
arith f _ x = f x
Run Code Online (Sandbox Code Playgroud)
但我有点困惑如何"解释"我刚才写的内容.我对类型签名的"阅读" arith类似于以下内容:
arith取一个函数,一个Integer,类型的参数a,并返回一个类型的结果b; 此外,arith作为第一个参数的函数是一个函数,它接受一个类型的参数a并返回一个类型的值b,该值必须是b类型为(或"约束")的类型Num.
之后,我想出了上面的'解决方案',但我没有使用"一些算术运算来组合'b'类型的值".不知怎的,我认为要么"提示"是误导性的,要么完全没问题,而且我错过了一些东西,如果是这样,那么我错过了什么?
我认为目标解决方案是:
arith f i a = f a + fromInteger i
Run Code Online (Sandbox Code Playgroud)
或者用或+替换的.-*
概述要求:在本练习中,您必须实现以下功能:
匹配类型签名arith :: Num b => (a -> b) -> Integer -> a -> b.
使用算术运算来组合类型的值b.
您将获得三种类型的值(a -> b),Integer并且a.作为第一步,您需要将它们转换为两个类型的值b.您可以通过应用获得第一个(a -> b)到a.然后你留下了类型的价值Integer.当你注意到类型类Num支持函数的实例fromInteger :: Integer -> a(其中type a是b我们定义的函数的上下文中的类型)时,很明显你可以b通过应用fromInteger你的Integer值来获得第二个类型值.第二步,b使用Num类型类中定义的算术运算之一组合两个类型的值.