使用'max'时没有(Ord a0)的实例

时间:2017-10-30 16:30:04

标签: haskell operand

我是haskell的新手,我正在尝试使用操作数。

function strangeMaths必须像logBase 2((max x)^ 3)一样,但使用3个函数和操作数。 所以我做了这个代码

strangeMaths = f . g . h

f = logBase 2 

g = (^3)

h = max

但这给了我一个错误:

No instance for (Ord a0) arising from a use of `max'
    The type variable `a0' is ambiguous
    Relevant bindings include
      h :: a0 -> a0 -> a0 (bound at 14)doItYourSelf.hs:7:1)
    Note: there are several potential instances:
      instance Integral a => Ord (GHC.Real.Ratio a)
        -- Defined in `GHC.Real'
      instance Ord () -- Defined in `GHC.Classes'
      instance (Ord a, Ord b) => Ord (a, b) -- Defined in `GHC.Classes'
      ...plus 23 others
    In the expression: max
    In an equation for `h': h = max
Failed, modules loaded: none.

P.S。我知道log(a,b ^ c)= c * log(a,b)但这只是一个例子。

1 个答案:

答案 0 :(得分:3)

你的问题是max有两个参数,而不是一个。

让我们检查.的签名:

(.) :: (b -> c) -> (a -> b) -> (a -> c)

我们清楚地看到,这些功能采用了一个参数和“链条”。他们在一起。

现在让我们看看max

max :: (Ord a) => a -> a -> a

这是一个接受两个参数的函数,换句话说,接受一个参数,然后返回另一个函数。例如,max 1 :: Int -> Int

现在让我们来看看g . h,这是您尝试撰写的函数的一部分:

  f . g
= (^2) . max
= \a -> (max a)^2

然后我们遇到了一个问题:max a是一个函数,而不是一个浮点值。因此编译器抱怨。这相当于尝试计算map^2reverse^2;它完全没有意义。

很遗憾你还没有说明strangeMaths应该做什么,所以我不能告诉你应该怎么写。但是,有几种方法可以解决这个问题:

  • h重写为max 1(而非max)或其他类似值。
  • strangeMaths重写为(.) (f . g) . h
  • Floating格式的函数编写a -> a实例。 (我不知道你会怎么做或为什么这样做,但这是可能的。)

我怀疑第二种情况是正确的,因为这意味着strangeMaths x y = logBase 2 ((max x y)^2),这更有意义。