我无法理解函数应用程序如何与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
我知道
$ :: (a->b) -> a -> b
f $ x = f x
Run Code Online (Sandbox Code Playgroud)
直觉上,在我看来,比如说,1. $将函数的评估延迟到左边2.评估其右边的结果3.将其左边的结果输入到右边.
这对我来说非常有意义,
ghci> length $ [1..5]
5
ghci> ($) length [1..5]
5
Run Code Online (Sandbox Code Playgroud)
我不明白的是为什么,
ghci> ($ [1..5]) length
5
Run Code Online (Sandbox Code Playgroud)
从$的类型来看,是不是它的(第一个)论证应该是一个函数?
Websocket片段有一个声明,在这样的封闭的parens中有美元符号,
any ($ fst client)
Run Code Online (Sandbox Code Playgroud)
因为haskellers使用$sign而不是parens,为什么我们需要parens?
为什么$parens之间有符号?
我试着看看是否$是一个功能
Prelude>:t $
Run Code Online (Sandbox Code Playgroud)
但它抛出了错误, parse error on input $
这种情况发生在你想将一堆函数应用于同一个变量的情况下,它可能如下所示:
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.这似乎有道理,但对我来说仍然不清楚.
任何人都可以清楚地解释它,它是另一种常见用法$,还有其他更多的用法$.
($) :: (a -> b) -> a -> b
f $ x = f x
Run Code Online (Sandbox Code Playgroud)
要么
($) f x = f x
Run Code Online (Sandbox Code Playgroud)
要么
($) = id
Run Code Online (Sandbox Code Playgroud)
但我不明白为什么这个定义能够替换括号,所以我试图通过定义:自己重现并检查行为,
k :: (a -> b) -> a -> b
k f x = f x
Run Code Online (Sandbox Code Playgroud)
但我得到的是:
-- these work:
(+2) `k` 4
(+2) `id` 4
sum `k` [1,2]
sum `id` [1,2]
map (flip(-)3) $ filter even `k` filter (>=0) [-5..10]
map (flip(-)3) $ filter even `id` filter …Run Code Online (Sandbox Code Playgroud) 我的Haskell代码如下
isNotPrime x = elem 0 map (mod x)[3.. (x-1)]
Run Code Online (Sandbox Code Playgroud)
编译时会显示这些错误
Couldn't match expected type ‘(t1 -> t1) -> [t1] -> t’
with actual type ‘Bool’
The function ‘elem’ is applied to four arguments,
but its type ‘([a0] -> [b0])
-> ((a0 -> b0) -> [a0] -> [b0]) -> Bool’
has only two
In the expression: elem 0 map (mod x) [3 .. (x - 1)]
In an equation for ‘prime’:
prime x = elem 0 map (mod x) [3 …Run Code Online (Sandbox Code Playgroud) 我对haskell的($)感到很困惑.
当我输入
:t ($)
Run Code Online (Sandbox Code Playgroud)
在ghci.我会得到
:($) :: (a -> b) -> a -> b
Run Code Online (Sandbox Code Playgroud)
但是,当我输入
:t ($ 3)
Run Code Online (Sandbox Code Playgroud)
我会得到
($ 3) :: Num a => (a -> b) -> b
Run Code Online (Sandbox Code Playgroud)
那么,为什么($)接受第二个参数没有任何错误?
什么是开始($)或(>>=)应该做的功能.我不是要问究竟是什么$或>>=意思,但我明白这一点
f :: Int -> Int
f x = x+2
Run Code Online (Sandbox Code Playgroud)
是一个取整数并添加两个的函数,但在学习Haskell的过程中我遇到的问题是解决方案如下所示:
($) :: (a -> b) -> (a -> b)
f $ x = f x
Run Code Online (Sandbox Code Playgroud)
我假设这意味着函数($)采用lambda(a - > b)并输出lambda(a - > b),然后下一行我不确定.
但我总是假设功能定义
f :: Int -> Int
Run Code Online (Sandbox Code Playgroud)
必须跟一个带有以f开头的参数的函数,就像我的第一个代码示例一样.
谢谢