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语言中的方法访问它们。
答案 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