haskell中的Python对象和方法

时间:2015-05-09 17:21:58

标签: python haskell

class Person:
  def __init(fname, lname):
    this.fname = fname
    this.lname = lname

  def greet():
    print "Good day, " + fname + ", " + lname

if __name__ == "__main__":
  p = Person("saravana", "kumar")
  p.greet()

输出

hello saravana, kumar

如何将这个简单的python代码移植到haskell?我热衷于学习oops概念,比如初始化对象状态并通过haskell语言中的方法访问它们。

2 个答案:

答案 0 :(得分:10)

首先不要以OOPS的思想来思考,这对Haskell来说是不行的,会让你感到痛苦。

尝试用Haskell的方式来思考问题,

data Person = Person { fname :: String, lname :: String } deriving Show

greet :: Person -> String
greet p = "Good day, " ++ fname p ++ ", " ++ lname p

ghci中的演示:

λ> greet $ Person "Erik" "Meijer"
"Good day, Erik, Meijer"

看到那有多简单?

答案 1 :(得分:4)

让我们尝试将它直接移植到Haskell ..

data Person = Person { fname :: String
                     , lname :: String 
                     }   

在你的Python代码中,任何Person对象都可以执行一个动作greet(),它执行一些IO,它被转换为Haskell:

greet :: Person -> IO ()
greet person = putStrLn $ (fname person) ++ " " ++ (lname person)

然后你会写main作为:

main :: IO ()
main = greet $ Person "Ben" "Tennyson"

现在,这样做有什么不对? - 纯度。

Haskell习语提供了将纯粹和不纯的代码分开的方法。 让我们试着用Haskell的方式......

创建一个类别,其元素可以是 / 学生 / 员工或所有共享的人一个共同的行动 greet()

class Human a where
  greet :: a -> String

我们还可以为类型创建显示实例:

instance Show Person where
  show person = (fname person) ++ " " ++ (lname person)

然后为创建一个实例,以实现 greet()操作:

instance Human Person where
  greet person = "Hello, " ++ (show person)

main :: IO ()
main = putStrLn . greet $ Person "Ben" "Tennyson"

-- λ main
-- Hello, Ben Tennyson