使用Haskell我想将函数组合在一起,就像在其他语言中使用面向对象一样。具体回答这个问题的回复
Does Haskell support object oriented programming
我们假设我有一个类型
data Class = Obj { a :: Int -> Int, b :: Int -> Int }
现在我想定义几个从a和b派生的其他函数(就是这样的方法)。一种方法是定义类似
的内容c :: Class -> Int -> Int
c obj x = myb (mya x)
where mya = a obj
myb = b obj
d :: Class -> Int -> Int
d obj x = myb (myc x)
where myb = b obj
myc = c obj
然而,这意味着在每个正则表达式模式中,我需要明确列出(在``where''子句中)我正在使用的其他函数。我的问题是:是否有更短的方法来实现这一目标?
答案 0 :(得分:1)
如果您的目标只是为了避免输入太多内容,则可以使用RecordWildCards
扩展程序:
{-# LANGUAGE RecordWildCards #-}
data Class = Obj { a :: Int -> Int, b :: Int -> Int }
f :: Class -> Int -> Int
f Obj{..} x = a x + b x
然后您可以像这样使用它:f (Obj id id) 10 == 20
请注意,这会影响实际的"字段访问者",因此,如果您仍然想要出于某种原因使用同一功能中的那些,则不起作用。
如果没有扩展程序,您也可以随时编写
f (Obj a b) x = a x + b x
(记录类型仍然可以使用常规构造函数语法进行模式匹配)。