【问题标题】:Using function like OOP method in Haskell在 Haskell 中使用类似 OOP 方法的函数
【发布时间】: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


【解决方案1】:

你写的只是风格问题。 (不过,对于 C/Java 程序员来说,使用 // 作为运算符似乎相当残忍。)出于几个原因,我不鼓励使用它,主要是因为:

  • 这不是惯用的 Haskell,并且会使任何试图阅读您的代码的 Haskell 人感到困惑
  • 您不应像想到 OOP 语言那样想到 Haskell

如果你想让 Haskell 看起来更像你最喜欢的 OOP 语言,那你就错了。 Haskell 看起来像数学:一种 lisp-y,具有前缀函数应用程序,但也具有可用的中缀函数和运算符。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-21
相关资源
最近更新 更多