Haskell数据类型的getter

时间:2017-10-14 21:49:41

标签: haskell

基本上,我有两种不同的结构 - Point和Cell。由于它们之间存在聚合,我想以某种方式获得Point的值只是通过拥有单元格 - 让我们说一下,我只有一个单元格,但我希望得到它的位置。 像这样a = Wall(Point(1,2)。我可以以某种方式得到它吗?像a.point一样?如果是这样,我可以以某种方式得到xy吗? a.point.x

data Point = Point(Int, Int) -- y, x
instance Show Point where
  show (Point(x, y)) = "(" ++ show x ++ "," ++ show y ++ ")"

data Cell = Wall(Point) | Path(Point) | Start(Point) | End(Point)
instance Show Cell where
  show (Wall(Point(x, y))) = "X"
  show (Path(Point(x, y))) = "("++show x ++ "," ++ show y ++ ")"
  show (Start(Point(x, y))) = "S"
  show (End(Point(x, y))) = "E"

1 个答案:

答案 0 :(得分:4)

首先,我认为您对data声明语法感到困惑:

data Point = Point(Int, Int)

这是一个采用单个元组参数的数据构造函数,即您认为parens是某种应用程序语法。我们可以问ghci:

Prelude> data Point = Point(Int, Int)
Prelude> :t Point
Point :: (Int, Int) -> Point

你真正想要的是:

Prelude> data Point = Point Int Int
Prelude> :t Point
Point :: Int -> Int -> Point

您遗失的第二部分称为记录语法,它允许您命名上面的两个Int字段。

data Point = Point { x :: Int, y :: Int }

这会将两个函数xy纳入范围,可以提取您感兴趣的数据:

Prelude> data Point = Point { x :: Int, y :: Int }
Prelude> let p = Point 2 3
Prelude> :t x
x :: Point -> Int
Prelude> x p
2
Prelude> y p
3

您可以对Wall执行相同操作,然后point . x会为您提供您正在寻找的功能Wall -> Int

"透镜"是关于使这类事物成为一流的,而且我建议不要立即探索。绝对要拿起一本好的哈克尔书,然后仔细研究第一章。