标签: function-composition

Haskell在最后调整以删除参数变量

我是一个尝试学习haskell的新手,我试图在其他论坛中寻找类似的东西但是找不到类似的问题.

addPoly :: (Num a)=>[[a]]->[a]
addPoly  x = map sum $ transpose x
Run Code Online (Sandbox Code Playgroud)

运行正常

但是当我最后删除x时,它会出错

addPoly :: (Num a)=>[[a]]->[a]
addPoly  = map sum $ transpose 
Run Code Online (Sandbox Code Playgroud)

错误说:

Couldn't match expected type `[[Integer]] -> [Integer]'
            with actual type `[Integer]'
In the expression: map sum $ transpose
In an equation for `addPoly': addPoly = map sum $ transpose

Couldn't match expected type `[[Integer]]'
            with actual type `[[a0]] -> [[a0]]'
In the second argument of `($)', namely `transpose'
In the expression: map sum $ …
Run Code Online (Sandbox Code Playgroud)

haskell pointfree function-composition

3
推荐指数
1
解决办法
502
查看次数

获取或更新的功能方式

我有一个缓存,并且有两个函数可以从缓存中获取项目并将项目放入缓存中。

当获取项目(从缓存)时,如果键不存在,我需要向其填充一个值并返回该值。

以下是示例代码

class CacheComp {
    cache = Map[String, Foo]

    get(id): Foo = {
        // case(id exists) => Return matching Foo

        // case(id not exists) => Create a Foo and update the cache with created Foo. Then return updated Foo
    } 

    put(id, Foo) = {
        // put element to the cache   
    }
}
Run Code Online (Sandbox Code Playgroud)

在这里我违反了get(id)功能的单一责任原则(SRP)。如何在不违反 SRP 的情况下做到这一点?我可以简单地将函数重命名为getOrUpdate(id). 但是有没有任何干净的函数式编程方法可以做到这一点?

functional-programming scala function-composition higher-order-functions

3
推荐指数
1
解决办法
843
查看次数

使用函数组合的 Haskell 绝对差

我试图定义一个函数来查找两个数字的绝对差,这样两个数字

absoluteDifference 2 5
absoluteDifference 5 2
Run Code Online (Sandbox Code Playgroud)

返回3

这是迄今为止我最大的努力:

absoluteDifference :: Num a => a -> a -> a
absoluteDifference = abs . (-)
Run Code Online (Sandbox Code Playgroud)

在我看来,这适用abs于两个数字相减的结果。但是,这给了我错误

* Could not deduce (Num (a -> a)) arising from a use of `abs'
    (maybe you haven't applied a function to enough arguments?)
  from the context: Num a
    bound by the type signature for:
               absoluteDifference :: Num a => a -> a -> a
    at C:\Users\Adam\dev\daily-programmer\e311\e311.hs:3:1-42
* In the first argument …
Run Code Online (Sandbox Code Playgroud)

haskell function-composition

3
推荐指数
1
解决办法
1312
查看次数

如何“Python方式”使用/链接函数?

我有一组函数f(x), g(x), s(x), t(x)

它们被设计为像这样链接在一起:f(g(s(t(x))))

这些函数经过精心设计,可以按任意顺序链接。我的代码的另一部分在列表中构建序列:[f, g, s, t]

有没有一种优雅的方法来获取列表并链接函数调用,获取最后结果的输出?

现在显然我可以使用一个类似外部计数器的变量来跟踪输出和一个简单的for循环增量索引,但我想知道是否有更Pythonic的方法来做到这一点?

python functional-programming function function-composition

3
推荐指数
1
解决办法
510
查看次数

Haskell - 应用将函子返回到函子上的函数

假设我有两个函数fg它们都接受常规值并返回一个Either像这样的值:

g :: a -> Either x b
f :: b -> Either x c
Run Code Online (Sandbox Code Playgroud)

我如何将两者链接在一起以获得类似的东西f . g

我想出的最佳解决方案是创建一个名为的辅助函数applyToRight,其工作方式如下

applyToRight :: (a -> Either x b) -> Either x a -> Either x b
applyToRight f x =
  case x of
    Left a -> Left a
    Right b -> f b
Run Code Online (Sandbox Code Playgroud)

这样我就可以做

applyToRight f (g a)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我专门谈论Either,但我认为这个问题可以推广到所有应用函子。处理这个问题的最优雅的方法是什么?

haskell composition functor function-composition applicative

3
推荐指数
1
解决办法
124
查看次数

如何在此处反转谓词?

我有以下过滤程序:

; (2) filter
(define (filter test sequence)
  ; return a list of the elements that pass the predicate test
  (let ((elem (if (null? sequence) nil (car sequence)))
        (rest (if (null? sequence) nil (cdr sequence))))
    (cond ((null? sequence) nil)
          ((test elem) (cons elem (filter test rest)))
          (else (filter test rest)))))
Run Code Online (Sandbox Code Playgroud)

下面是一个使用它返回列表的偶数元素的示例:

(define even? (lambda (x) (= (modulo x 2) 0)))
(define sequence '(1 2 3 4 5 8 9 11 13 14 15 16 17))
(filter even? sequence)
; (2 …
Run Code Online (Sandbox Code Playgroud)

lisp scheme predicate function-composition racket

3
推荐指数
1
解决办法
90
查看次数

使用组合来获得除法的上限

我正在学习 haskell,并且我正在尝试仅使用组合来重写函数

这是我试图重构的函数:

ceilingDiv a b = ceiling (a / b)
Run Code Online (Sandbox Code Playgroud)

到目前为止,我设法使用 curry 和 uncurry 使其工作,但感觉很脏:

ceilingDiv = curry $ ceiling . uncurry (/)
Run Code Online (Sandbox Code Playgroud)

有什么办法可以更干净地做到这一点吗?我在想ceiling . div,但它不起作用,因为(/)返回一个函数,而上限接受 Double 作为其参数。

haskell currying function-composition

3
推荐指数
2
解决办法
145
查看次数

APL 列车的 Haskell 版本

TLDR:是否有一个 Haskell 库提供函数定义(最好具有简洁的符号或命名)来处理多参数函数组合的常见模式,例如 APL 中的模式?

完整问题:

我是 Haskell 的新手,最近我发现自己在问其他 Haskell 新用户提出的组合问题类型,例如如何用二元函数组合一元函数如何以特定方式组合两个二元函数。尽管函数组合模式的目标相当明确(并且可能相当常见),但这两个问题的无点解决方案都(.)(.)(.)相当LiftM2 (.)不直观(要么 要么 )。

我花了一点时间使用 APL 语言,并且非常喜欢它的简单而强大的函数组合模型。例如,下面是许多组合模式的图表,可以用极其简洁的符号来完成,在人们花一些时间学习该语言后,这些符号实际上是相当可读的。

任何这些 APL 模式都可以在 Haskell 中通过编写简单的 lambda 表达式来完成。例如,我的 Haskell 文件之一中有以下行

(...) = (.)(.)(.)
Run Code Online (Sandbox Code Playgroud)

或者(可能更清楚)可以写成

(...) = \f g x y = f (g x y)
Run Code Online (Sandbox Code Playgroud)

或者使用更清晰的名称

_1_atop_2 = \f g x y = f (g x y)
Run Code Online (Sandbox Code Playgroud)

这样我就可以在代码的主要部分中以无点风格轻松地组合一元函数和二元函数。例如,要定义实值之间的距离函数,我只需将绝对值与减法相结合:

dist = abs ... (-)
Run Code Online (Sandbox Code Playgroud)

或者

dist = _1_atop_2 abs (-)
Run Code Online (Sandbox Code Playgroud)

(在这种情况下,更明确的风格dist x y …

haskell apl function-composition

3
推荐指数
1
解决办法
210
查看次数

Scala中的整洁功能组合

构成函数的常用方法

def f(i: Int) = i + 1
Run Code Online (Sandbox Code Playgroud)

包括

f(f(1))
Run Code Online (Sandbox Code Playgroud)

然而,如何启用或定义更简洁的语法,如

f f 1
Run Code Online (Sandbox Code Playgroud)

在Scala的函数组合的简明语法中制定了类似的查询虽然不清楚如何达到这种简洁的语法.

更新如果可能,这怎么可能实现,至少以类似(整洁)的方式?

scala function-composition

2
推荐指数
1
解决办法
203
查看次数

为什么匿名函数定义语法不同?

我们可以定义和使用这样的匿名函数:

repl=> (#(+ 10 %) 1)
11
Run Code Online (Sandbox Code Playgroud)

->宏不会接受这样的匿名功能.假设我想添加10然后乘以2.我会尝试写:

(-> 5 #(+ 10 %) #(* 2 %))
Run Code Online (Sandbox Code Playgroud)

但由于某种原因,这不是正确的代码,正确的代码是

(-> 5 (+ 10) (* 2))
Run Code Online (Sandbox Code Playgroud)

(+ 10)和之间的区别是什么#(+ 10 %),为什么不->接受宏定义的匿名函数#()

clojure anonymous-function function-composition

2
推荐指数
1
解决办法
86
查看次数