基本上,我有两种不同的结构 - Point和Cell。由于它们之间存在聚合,我想以某种方式获得Point的值只是通过拥有单元格 - 让我们说一下,我只有一个单元格,但我希望得到它的位置。
像这样a = Wall(Point(1,2)
。我可以以某种方式得到它吗?像a.point
一样?如果是这样,我可以以某种方式得到x
和y
吗? 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"
答案 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 }
这会将两个函数x
和y
纳入范围,可以提取您感兴趣的数据:
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
。
"透镜"是关于使这类事物成为一流的,而且我建议不要立即探索。绝对要拿起一本好的哈克尔书,然后仔细研究第一章。