Haskell应用程序,还是部分?

gut*_*rie 2 haskell operators

我想翻转列表构造函数用法,以获得类型:

[a] -> a -> [a]
Run Code Online (Sandbox Code Playgroud)

(用于折叠),所以尝试:

(flip :)
Run Code Online (Sandbox Code Playgroud)

但它给出了类型:

Prelude> :t (flip :)
(flip :) :: [(a -> b -> c) -> b -> a -> c] -> [(a -> b -> c) -> b -> a -> c]
Run Code Online (Sandbox Code Playgroud)

这让我感到惊讶,但似乎这被解析为(:)的左侧部分,而不是翻转的部分应用.使用flip作为中缀重写它似乎克服了这一点,

Prelude> :t ((:) `flip`)
((:) `flip`) :: [a] -> a -> [a]
Run Code Online (Sandbox Code Playgroud)

但是我找不到定义这种行为的规则,我认为函数应用程序是最高优先级,并且被评估为left-> right,所以我希望这两种形式是等价的.

Sib*_*ibi 8

你想要做的是:

?> :t (flip (:))
(flip (:)) :: [a] -> a -> [a]
Run Code Online (Sandbox Code Playgroud)

Haskell中的运算符是中缀.因此,当您这样做时,flip :它以中缀方式运行,即flip应用于:功能.通过明确地添加括号flip (:),您可以告诉它:应该应用于flip.您也可以使用反引号运算符flip来制作已经尝试过的中缀.

  • 打破它可以帮助你看到一致性:`让cons =(:) in flip cons`工作,`让cons =:in flip cons`是一个错误 (3认同)