组成两个函数时出错

时间:2016-03-13 14:25:26

标签: haskell function-composition

我尝试用类型指定组合两个函数。

foo :: Num a => a -> a
foo a = a + 2

bar :: Num a => a -> a
bar a = a * 2

fooBarCompose :: (Num a, Num b, Num c) => (a -> b) -> (c -> a) -> c -> b
fooBarCompose f g = f . g

我的模块编译,但在运行时调用

fooBarCompose bar foo

我收到错误:

No instance for (Show (b0 -> b0))
  (maybe you haven't applied enough arguments to a function?)
  arising from a use of ‘print’
In the first argument of ‘print’, namely ‘it’
In a stmt of an interactive GHCi command: print it

为什么我得到这个?

1 个答案:

答案 0 :(得分:11)

  

为什么我得到这个?

你不。你写的所有东西都很好用。您可以在任何所需的程序中使用fooBarCompose bar foo

只有当你尝试在GHCi中评估时,它才会出现问题:fooBarCompose bar foo是一个函数。它应该如何显示一个功能?显示所有可能输入和相应结果的详尽列表?显然不可行。 GHCi在引擎盖下使用print,它只调用show。而且,因为它不可能显示一个函数,它会给出一条错误信息,说明这一点。

OTOH,可以很容易地显示将函数应用于任何单个值的结果,例如

> fooBarCompose bar foo 2  -- aka `bar . foo $ 2`
8