haskell状态和类型

时间:2011-06-02 13:47:32

标签: haskell state typeclass setter

如何将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 })
 

1 个答案:

答案 0 :(得分:1)

你似乎在这里混淆了多个概念,以至于我不确定你的目标是什么。关于你可能会追求什么的一些想法:

  • 字段访问,即检查或替换较大数据结构的方法。这并不适用于类型类,因为对于“内部字段”和“数据结构”的许多组合,可能存在多个访问器。沿着这些线的抽象通常被称为“镜头”。

  • 有状态引用以某种通用方式。对于State monad中的大多数情况,这相当于将上述镜头与标准getput组合在一起。在这种情况下,您可以为特定monad和访问者数据类型的组合设置类型类,但它实际上并没有那么多。

  • 重载对特定字段的访问,以便函数可以处理包含“x”字段的任何数据类型。在这种情况下,我假设你也想要“y”,作为2D点的某种类型类。但是,这与上述问题完全不同。

也许你可以澄清你的目标?