has中的Python对象和方法

2024-09-27 00:12:33 发布

您现在位置:Python中文网/ 问答频道 /正文

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语言中的方法访问它们。你知道吗


Tags: ifinithaskelldefthisfnameclassperson
2条回答

让我们试着把它移植到Haskell那里。。你知道吗

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

在Python代码中,任何Person对象都可以执行一个action greet(),该操作执行一些IO,这些IO被转换为Haskell:

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

然后你将main写成:

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

现在,这样做有什么不对?-纯洁。你知道吗

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

创建一个类别,其元素可以是一个/学生/员工或任何有共同行为的人

class Human a where
  greet :: a -> String

我们还可以为Person类型创建Show实例:

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

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

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

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

  λ main
  Hello, Ben Tennyson

首先,不要抱着糟糕的想法去想,那对哈斯克尔来说是行不通的,会给你带来痛苦。你知道吗

试着用哈斯克尔的方式来思考问题

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"

你看这有多简单?你知道吗

相关问题 更多 >

    热门问题