【发布时间】:2012-01-15 08:04:10
【问题描述】:
这几天在学习Haskell,有了一个使用OOP之类的函数的想法。
首先,定义一个运算符如下:
(//) :: a -> (a -> b) -> b
x // f = f x
如您所见,此运算符将函数f 和参数x 的顺序颠倒,然后应用它。例如,equals 可以定义为:
equals :: Eq a => a -> a -> Bool
equals = \x -> \y -> x == y
comparison = (1 + 2) // equals 3 -- True
现在这是我的问题。 像 OOP 方法一样使用 Haskell 函数是不是好方法? 这意味着函数和(第一个)参数的反转是好还是坏。
更新
这里是反引号(`) 不可用的情况。
data Person = Person { name :: String }
myself = Person "leafriend"
然后
> name myself
"leafriend"
> myself // name
"lefirend"
> myself `name`
ERROR - Syntax error in expression (unexpected end of input)
【问题讨论】:
-
这不是 OOP,这只是语法上的怪异。如果你去询问
1 + 2的结果以获取一个名为equals的方法并使用结果和3作为参数调用它,那将是OOP。 -
你不需要定义
//。在 Haskell 中,f a b可以写成a `f` b,所以你可以写成comparison = (1 + 2) `equals` 3。 -
delnan // 是的,你是对的。这不是 OOP,只是不同顺序的语法。我的问题只是出于好奇。
-
这种反向形式的应用程序在大约十年前被用于许多 Haskell 项目和论文(Wash HTML 模板、COM 脚本)中 - 尽管
#而不是//是首选的运算符符号.这是 Hugs 比 GHC 更受欢迎的时候。由于 GHC 使用哈希作为原始类型和操作的魔法符号,因此随着社区迁移到 GHC,这种风格感觉不再使用。我认为这很不幸,因为在某些明显的情况下,这种风格比普通的前向应用更清晰(当然,一旦你知道了成语)。 -
@stephen tetley:不过,我们仍然有一个反向应用运算符!比较
(#) :: a -> (a -> b) -> b与(>>=) :: m a -> (a -> m b) -> m b...
标签: oop function haskell methods