标签: operator-sections

使用中缀函数的部分应用程序

虽然我对数学意义上的currying有一点了解,但部分应用中缀函数是一个新概念,我在深入研究" 了解你是一个很好的Haskell "一书后发现了这个概念.

鉴于此功能:

applyTwice :: (a -> a) -> a -> a
applyTwice f x = f (f x)
Run Code Online (Sandbox Code Playgroud)

作者以一种有趣的方式使用它:

ghci> applyTwice (++ [0]) [1]  
[1,0,0]
ghci> applyTwice ([0] ++) [1]
[0,0,1]
Run Code Online (Sandbox Code Playgroud)

在这里我可以清楚地看到,结果函数传递了不同的参数,这不会通过正常的方式发生,因为它是一个curried函数(是吗?).那么,Haskell对中缀切片有什么特殊处理吗?它对所有中缀函数都是通用的吗?


作为旁注,这是我使用Haskell和函数式编程的第一周,我还在读这本书.

haskell functional-programming currying partial-application operator-sections

12
推荐指数
3
解决办法
2123
查看次数

Haskell美元运算符应用程序

我无法理解函数应用程序如何与haskell中的currying一起工作.如果我有以下功能:

($) :: (a -> b) -> a -> b
Run Code Online (Sandbox Code Playgroud)

我明白要部分应用这个功能,我需要提供(a -> b)函数($第一个参数).

为什么可以先应用一个值(即反向参数)?

($ 0) :: Num a => (a -> b) -> b
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?

haskell operators partial-application dollar-sign operator-sections

11
推荐指数
1
解决办法
1903
查看次数

Haskell中的函数应用程序

好吧,这是漫长的一天,我的大脑可能无法在Haskell级别上运行,但我无法理解"了解你一个Haskell"中的一个例子.

该部分称为带有$的函数应用程序,并且有一个如何$定义的示例:

($) :: (a -> b) -> a -> b
f $ x = f x
Run Code Online (Sandbox Code Playgroud)

到目前为止一切都很清楚.我理解本节中的所有示例,除了最后一个:

ghci> map ($ 3) [(4+), (10*), (^2), sqrt]
[7.0,30.0,9.0,1.7320508075688772]
Run Code Online (Sandbox Code Playgroud)

这里我们映射($ 3)函数列表并获得这些函数的应用结果3.但这怎么可能呢?

从第一个代码片段可以看出,第一个参数是一个函数,我们甚至可以写:

*Main> ($) sqrt 4
2.0
Run Code Online (Sandbox Code Playgroud)

现在($ 3)是功能的部分应用$,但3继续功能的位置!所以3应该是一个功能还是什么?

还有另一个谜团:到底是(4+)什么?我知道这(+4)是部分应用功能+,所以(4+)应该部分应用功能4吗?废话.什么样的伎俩在这里有效?

haskell function operators partial-application operator-sections

8
推荐指数
2
解决办法
337
查看次数

适用于<$>和<*>的运算符部分

考虑类型的函数a -> b -> c和应用值a1, a2 :: (Applicative f) => f a.

我希望构造一个函数,该函数可以应用于类型的函数a -> b -> c以获得类型的值Applicative f :: f c.我可以通过以下方式执行此操作:

g :: (Applicative f) => (a -> b -> c) -> f c
g = \f -> f <$> a1 <*> a2
Run Code Online (Sandbox Code Playgroud)

(显式lambda是故意的,因为我正在考虑在任何级别构建此函数,而不仅仅是顶层).

如果我尝试g用无点样式编写:

g = (<$> a1 <*> a2)
Run Code Online (Sandbox Code Playgroud)

我得到以下编译错误:

The operator `<$>' [infixl 4] of a section
    must have lower precedence than that of the operand,
      namely …
Run Code Online (Sandbox Code Playgroud)

haskell applicative operator-sections

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

如何理解Haskell中的这个`$`用法

这种情况发生在你想将一堆函数应用于同一个变量的情况下,它可能如下所示:

map (\f->f 4) [odd, even]
Run Code Online (Sandbox Code Playgroud)

但是从LYAH使用$它非常整洁

map ($ 4) [odd, even]
Run Code Online (Sandbox Code Playgroud)

为什么会这样呢?首先我在ghci中键入它$ 4 odd,它失败了,然后我打字($ 4) odd,它工作正常.然后我检查($ 4)使用:t哪个显示的类型($ 4) :: Num a => (a -> b) -> b,oddodd :: Integral a => a -> Bool.这似乎有道理,但对我来说仍然不清楚.

任何人都可以清楚地解释它,它是另一种常见用法$,还有其他更多的用法$.

syntax haskell operators dollar-sign operator-sections

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

节是柯里化的结果吗?

Hutton 的 Haskell 编程

一般来说,if 是一个运算符,则参数 和 的 #形式的表达式 称为节,其作为函数的含义可以使用 lambda 表达式形式化,如下所示:(#)(x #)(# y)xy

(#)   =   \x  ->  (\y ->  x   #   y)
(x    #)  =   \y  ->  x   #   y
(#    y)  =   \x  ->  x   #   y
Run Code Online (Sandbox Code Playgroud)

“部分”和“柯里化”有什么区别和关系?

一个部分是将柯里化操作应用于多参数函数的结果吗?

谢谢。

haskell operators currying partial-application operator-sections

0
推荐指数
1
解决办法
381
查看次数