假设我在Haskell中有这些数据的定义。如何为任何数据构造函数编写泛型函数?
data Point a = Point a a
data Piece a = One a | Two a
,我想有一个像
place :: Num a => Piece (Point a) -> Point a
place (Piece x) = x
一个功能我该怎么做,因为Haskell没有允许特定形式的功能。
解决方案
问题是我的数据定义(多年经验的编程是干扰这里...)。我希望我的Piece数据能够有效地完成2件不同的事情,一件作品也是一种作品,我试图通过继承来实现这一点,这只是一种糟糕的做法。以下面的方式分离数据解决了这个问题。
data PieceKind = One | Two | ... | n
data Piece a b = Piece a PieceKind
这样,我的作品实际上有两个属性的“a”(对我来说这是一块的位置),也PieceKind,这样我能写的地方的功能,而无需重复它通过以下方式每一种部件:
place :: Num a => Piece (Point a) PieceKind -> Point a
place (Piece x _) = x
另外我也能写功能,适用于特定类型的一块:
place :: Num a => Piece (Point a) PieceKind -> Point a
place (Piece _ One) = ...
,这是我真正想要的。
你的意图是让它像'place(One x)= x;地方(两个x)= x'? –
是的,我不想为每个构造函数都有一个函数,而只想为它们提供一个函数。 –
通过定义'Point'来让你的问题自成一体。 – Jubobs