Haskell 设计一元类型

Haskell 设计一元类型,haskell,monads,combinators,Haskell,Monads,Combinators,我需要一些帮助来设计一元数据类型,我似乎很难理解这个想法,但我非常清楚我想要什么。在这件事上,似乎只有打字人员需要一些说服力 我想要的是一些可以是monad的数据类型原语。它的函数基本上是绘图原语,我希望能够将它们和原语组合起来,就像库parsec中的Parser类型一样。但实际绘图必须使用IOmonad 顺便说一句,我还有一个类可绘制a,如下所示: class Drawable a where draw :: (MonadIO m) => Pos -> a -> m

我需要一些帮助来设计一元数据类型,我似乎很难理解这个想法,但我非常清楚我想要什么。在这件事上,似乎只有打字人员需要一些说服力

我想要的是一些可以是monad的数据类型
原语
。它的函数基本上是绘图原语,我希望能够将它们和原语组合起来,就像库
parsec
中的
Parser
类型一样。但实际绘图必须使用
IO
monad

顺便说一句,我还有一个类
可绘制a
,如下所示:

class Drawable a where
    draw :: (MonadIO m) => Pos -> a -> m ()

当然,我希望每一个原始元素都是可绘制的。非常感谢您的意见。

我不明白您为什么认为这应该是单子。什么是一元的

您应该首先设计所需的API,并逐步考虑如何对其进行抽象


顺便说一句,Brent的图表库有一个非常好的合成API,可以提供一些好的想法:

我看了一下,它与我的第一个想法非常相似:创建递归数据类型。但是我决定不这样做,因为我想立刻绘制原语,因为一个
原语可以每秒绘制几次,而不是像库中那样只绘制一次。如果每次绘制时都会生成复杂的数据类型,这可能会造成相当大的开销。这听起来很像Cairo-Haskell API。看看这个,我希望你能给出开罗的参考答案,这样我就可以勾选它了。谢谢cf也是。这是一个合成绘图API(应用程序,而不是一元),其类型参数用于选择(检测单击的内容)。解决了这个问题。
draw
方法对我来说没有意义。我宁愿选择这种类型的签名:
draw::Pos->a->IO()
。为什么
draw
会返回除单位以外的任何东西……它不只是一个输出函数吗?@Dan是的,我刚刚看到它。谢谢你指出它,没有仔细看就复制了它。