我想翻转列表构造函数用法,以获得类型:
[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,所以我希望这两种形式是等价的.
你想要做的是:
?> :t (flip (:))
(flip (:)) :: [a] -> a -> [a]
Run Code Online (Sandbox Code Playgroud)
Haskell中的运算符是中缀.因此,当您这样做时,flip :它以中缀方式运行,即flip应用于:功能.通过明确地添加括号flip (:),您可以告诉它:应该应用于flip.您也可以使用反引号运算符flip来制作已经尝试过的中缀.