我是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)但这只是一个例子。
答案 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^2
或reverse^2
;它完全没有意义。
很遗憾你还没有说明strangeMaths
应该做什么,所以我不能告诉你应该怎么写。但是,有几种方法可以解决这个问题:
h
重写为max 1
(而非max
)或其他类似值。strangeMaths
重写为(.) (f . g) . h
。Floating
格式的函数编写a -> a
实例。 (我不知道你会怎么做或为什么这样做,但这是可能的。)我怀疑第二种情况是正确的,因为这意味着strangeMaths x y = logBase 2 ((max x y)^2)
,这更有意义。