虽然我对数学意义上的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
我无法理解函数应用程序如何与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
好吧,这是漫长的一天,我的大脑可能无法在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
考虑类型的函数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) 这种情况发生在你想将一堆函数应用于同一个变量的情况下,它可能如下所示:
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,odd是odd :: Integral a => a -> Bool.这似乎有道理,但对我来说仍然不清楚.
任何人都可以清楚地解释它,它是另一种常见用法$,还有其他更多的用法$.
Hutton 的 Haskell 编程
一般来说,if 是一个运算符,则参数 和 的
#形式的表达式 称为节,其作为函数的含义可以使用 lambda 表达式形式化,如下所示:(#)(x #)(# y)xyRun Code Online (Sandbox Code Playgroud)(#) = \x -> (\y -> x # y) (x #) = \y -> x # y (# y) = \x -> x # y
“部分”和“柯里化”有什么区别和关系?
一个部分是将柯里化操作应用于多参数函数的结果吗?
谢谢。
haskell operators currying partial-application operator-sections