如何将getX和putX分组到类实例中? 以下代码是此帖Class set method in Haskell using State-Monad
的答案
import Control.Monad.State
data Point = Point { x :: Int, y :: Int } deriving Show
getX :: State Point Int
getX = get >>= return . x
putX :: Int -> State Point ()
putX newVal = do
pt - get
put (pt { x = newVal })
increaseX :: State Point ()
increaseX = do
x - getX
putX (x + 1)
稍后我希望我将为2个类的层次结构实现setter和getter,但是现在我只想做这样的事情:
class A a where
putX :: Int -> State Point ()
instance A (State Point) where
putX newVal = do
pt - get
put (pt { x = newVal })
答案 0 :(得分:1)
你似乎在这里混淆了多个概念,以至于我不确定你的目标是什么。关于你可能会追求什么的一些想法:
字段访问,即检查或替换较大数据结构的方法。这并不适用于类型类,因为对于“内部字段”和“数据结构”的许多组合,可能存在多个访问器。沿着这些线的抽象通常被称为“镜头”。
有状态引用以某种通用方式。对于State
monad中的大多数情况,这相当于将上述镜头与标准get
和put
组合在一起。在这种情况下,您可以为特定monad和访问者数据类型的组合设置类型类,但它实际上并没有那么多。
重载对特定字段的访问,以便函数可以处理包含“x”字段的任何数据类型。在这种情况下,我假设你也想要“y”,作为2D点的某种类型类。但是,这与上述问题完全不同。
也许你可以澄清你的目标?