普通的功能组成属于这种类型
(.) :: (b -> c) -> (a -> b) -> a -> c
Run Code Online (Sandbox Code Playgroud)
我认为这应该概括为类型:
(.) :: (c -> d) -> (a -> b -> c) -> a -> b -> d
Run Code Online (Sandbox Code Playgroud)
一个具体的例子:计算差分平方.我们可以写diffsq a b = (a - b) ^ 2,但感觉我应该能够编写(-)和(^2)编写类似的东西diffsq = (^2) . (-).
当然,我不能.我可以做的一件事是使用一个元组而不是两个参数(-),通过转换它uncurry,但这不一样.
有可能做我想要的吗?如果没有,我误解的是什么让我认为它应该是可能的?
注意:这里已经有效地提出过这个问题,但是没有给出答案(我怀疑必须存在).
当我有类似的功能
f :: (Ord a) => a -> a -> Bool
f a b = a > b
Run Code Online (Sandbox Code Playgroud)
我想用make函数包装这个函数.
例如,使这样的功能
g :: (Ord a) => a -> a -> Bool
g a b = not $ f a b
Run Code Online (Sandbox Code Playgroud)
我可以像组合一样组合
n f = (\a -> \b -> not $ f a b)
Run Code Online (Sandbox Code Playgroud)
但我不知道怎么做.
*Main> let n f = (\a -> \b -> not $ f a b)
n :: (t -> t1 -> Bool) -> t -> t1 -> Bool …Run Code Online (Sandbox Code Playgroud) 我编写了一个名为'oddOf'的函数,它可以正确地确定给定值是否在列表中具有奇数个存在.它定义如下:
oddOf :: (Eq a) => a -> [a] -> Bool
oddOf value list = oddOf' value list False
where oddOf' val (x:xs) acc = if x == val
then oddOf' val xs (not acc)
else oddOf' val xs acc
oddOf' _ _ acc = acc
Run Code Online (Sandbox Code Playgroud)
我想编写一个函数来确定给定值是否在列表中具有偶数个存在.当呈现诸如这些的二元选择时,最佳实践是实现一个并将另一个定义为"不是它的补充".考虑到这一点,我尝试了这个定义:
evenOf = not oddOf
Run Code Online (Sandbox Code Playgroud)
对我来说,这看起来像是一个合理的部分应用函数,但它不是有效的Haskell代码.我需要更好地理解的语言是什么?定义evenOf我正在寻找的优雅方式是什么?