在Haskell中对函数进行分组

时间:2018-04-18 08:25:26

标签: oop haskell

使用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''子句中)我正在使用的其他函数。我的问题是:是否有更短的方法来实现这一目标?

1 个答案:

答案 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

(记录类型仍然可以使用常规构造函数语法进行模式匹配)。