【问题标题】:Haskell >.> notationHaskell >>.> 符号
【发布时间】:2011-12-28 10:58:03
【问题描述】:

在“函数编程的工艺”一书中,符号“>.>”将函数连接在一起,与“.”的方向相反。但是当我使用 ghci 实现它时,它显示错误 '>.>' 超出范围。为什么?它是不再使用的旧符号吗?

【问题讨论】:

    标签: haskell syntax operators notation


    【解决方案1】:

    >.>默认没有定义,你可以自己定义:

    infixl 9  >.>
    (>.>) = flip (.)
    

    或等价的,

    infixl 9  >.>
    f >.> g = g . f
    

    (我根据Prelude中的infixr 9 .给出了固定性声明。)

    【讨论】:

    • 也可以直接:(f >.> g) x = g (f x)(>.>) f g x = g (f x)
    【解决方案2】:

    可能只是书上定义的一个函数(我没看过书)。 AFAIK,>.> 不在任何地方使用。你可以自己定义:

    (>.>) = flip (.)
    

    事实上的符号似乎是(#)

    由于函数是 箭头 "Control.Category" 你也可以使用 >>>,例如

    Prelude Control.Category> ((*2) . (+1)) 4
    10
    Prelude Control.Category> ((*2) <<< (+1)) 4
    10
    Prelude Control.Category> ((*2) >>> (+1)) 4
    9
    Prelude Control.Category> ((+1) >>> (*2)) 4
    10
    

    【讨论】:

    • 感谢您提供这个简单明确的答案。但我就是不明白,书中怎么会有这个符号,它没有在书中定义它,它像标准符号一样使用它。 >.> 甚至在本书的索引和所有不同的 Haskell 运算符的图表中......
    【解决方案3】:

    (&gt;.&gt;) 似乎没有在标准库中定义。但是,Control.Category 中有(&gt;&gt;&gt;),其行为相同:

    Prelude> :m + Control.Category
    Prelude Control.Category> :i (>>>)
    (>>>) :: Category cat => cat a b -> cat b c -> cat a c
        -- Defined in Control.Category
    infixr 1 >>>
    Prelude Control.Category> let f = (* 2) >>> (+ 3)
    Prelude Control.Category> f 5
    13
    

    请注意,您可以使用Hoogle 来解决这些问题。

    此外,您当然可以始终自己定义这样的运算符:

    (>.>) :: (a -> b) -> (b -> c) -> (a -> c)
    f >.> g = g . f
    

    然后你可以写:

    Main*> ((* 2) >.> (+ 3)) 5
    13
    
    猜你喜欢
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多