相关疑难解决方法(0)

类型(c→d)→(a→b→c)→(a→b→d)的Haskell函数组合算子

普通的功能组成属于这种类型

(.) :: (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,但这不一样.

有可能做我想要的吗?如果没有,我误解的是什么让我认为它应该是可能的?


注意:这里已经有效地提出这个问题,但是没有给出答案(我怀疑必须存在).

haskell pointfree function-composition

39
推荐指数
5
解决办法
9075
查看次数

如何用任意arity函数组合`not`?

当我有类似的功能

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)

haskell functional-programming function composition

31
推荐指数
4
解决办法
5659
查看次数

在不考虑实现细节的情况下定义与其他函数相关的函数

我编写了一个名为'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我正在寻找的优雅方式是什么?

haskell

5
推荐指数
2
解决办法
169
查看次数