gpt4 book ai didi

Haskell 应用程序或部分?

转载 作者:行者123 更新时间:2023-12-02 06:00:20 24 4
gpt4 key购买 nike

我想翻转列表构造函数的用法,使其具有类型:

[a] -> a -> [a]

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

(flip :)

但它给出了类型:

Prelude> :t (flip :)
(flip :) :: [(a -> b -> c) -> b -> a -> c] -> [(a -> b -> c) -> b -> a -> c]

这让我很吃惊,但它似乎被解析为 (:) 的左侧部分,而不是 flip 的部分应用。使用 flip as infix 重写它似乎可以克服这个问题,

Prelude> :t ((:) `flip`)
((:) `flip`) :: [a] -> a -> [a]

但是我找不到定义这种行为的规则,我认为函数应用程序是最高优先级的,并且是从左->右求值的,所以我本以为这两种形式是等价的。

最佳答案

你想要做的是这样的:

λ> :t (flip (:))
(flip (:)) :: [a] -> a -> [a]

Haskell 中的运算符是中缀的。因此,当您执行 flip : 时,它以中缀方式运行,即 flip 应用于 : 函数。通过在 flip (:) 中显式放置括号,您告诉 : 应该应用于 flip。您还可以在 flip 中使用反引号运算符来制作您已经尝试过的中缀。

关于Haskell 应用程序或部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27670028/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com