Haskell newtype,但保留旧功能

时间:2011-08-25 02:16:06

标签: haskell

我想定义一种“理想”类型,它是一个列表,但有一些结构。数字前奏已经为列表定义了Ring的实例,但它们没有使用我想要的加法和乘法的定义。所以我想在这个例子中我应该说

newtype Ideal a = Ideal [a]

这样可以正常使用,但现在如果我尝试这样做会给我一个错误,比如说take 5 $ Ideal [0..]

有没有办法可以保留我想要的功能,只覆盖我明确覆盖的定义?

2 个答案:

答案 0 :(得分:11)

如果您没有自动设置完全的内容,则可以使用the newtype package中的实用程序功能,例如类似于over Ideal $ take 5

编辑另外,另外,从newtype包扩展函数以处理其他情况并不困难。例如,我有这些定义:

infixl 3 ./
(./) :: (Newtype n o) => (o -> t) -> (n -> t)
(./) fx = fx . unpack

liftN f x = pack $ f ./ x
liftN2 f x y = pack $ f ./ x ./ y
liftN3 f x y z = pack $ f ./ x ./ y ./ z

我怀疑,实际上并不是这种组合器的最佳设计,但你明白了。

答案 1 :(得分:6)

对于普通功能,没有。你必须提供自己的定义。

但是,对于属于类型类的函数,可以使用GeneralizedNewtypeDeriving扩展名从newtype的基础类型公开所需的类型类。

{-# LANGUAGE GeneralizedNewtypeDeriving #-}
newtype MyState a = MyState (State Int a)
    deriving (Monad)