Haskell 为什么可以';我做(翻转(+;).digitToInt)$';4';4.

Haskell 为什么可以';我做(翻转(+;).digitToInt)$';4';4.,haskell,syntax,Haskell,Syntax,我只是想知道$是如何工作的:我期待着 > (flip (+).digitToInt) $ '4' 4 <interactive>:1:24: Couldn't match expected type `t -> Char' against inferred type `Char' In the second argument of `($)', namely '4' 4 In the expression: (flip (+

我只是想知道
$
是如何工作的:我期待着

> (flip (+).digitToInt) $ '4' 4

<interactive>:1:24:
    Couldn't match expected type `t -> Char'
           against inferred type `Char'
    In the second argument of `($)', namely '4' 4
    In the expression: (flip (+) . digitToInt) $ '4' 4
    In the definition of `it': it = (flip (+) . digitToInt) $ '4' 4
而且,我看到了以下类型:

>  :t (flip (+).digitToInt)
(flip (+).digitToInt) :: Char -> Int -> Int
但是,我不明白为什么我不能显式地调用apply
(flip(+).digitToInt)

这种混乱来自于一个基本的观察,即

DigitPoint$'5'

数字点'5'

允许具有相同的效果-除了顶部有稍多的线噪声

(flip (+).digitToInt) $ '4' 4

(flip (+).digitToInt) $ ('4' 4)
这当然不起作用,因为
'4'
不是一个函数

为了得到你想要的行为,你可以

(flip (+).digitToInt $ '4') 4
或者只是

(flip (+).digitToInt) '4' 4

为什么呢?即使这样也不起作用(
(flip(+).digitToInt)$'4'$4
,我希望它能显式地显示咖喱效果。事实上,这可能是有意义的:这是有效的(
((flip(+).digitToInt)$'4')$4
@Evan:因为$的优先级较低,并且是右关联的
foo$bar$baz
被解析为
foo$(bar$baz)
,因此您仍在尝试应用
'4'
,就好像它是一个函数一样。如果您需要这些参数/和/
$
,您可能做错了什么。
(flip (+).digitToInt) '4' 4