我想定义一种“理想”类型,它是一个列表,但有一些结构。数字前奏已经为列表定义了Ring
的实例,但它们没有使用我想要的加法和乘法的定义。所以我想在这个例子中我应该说
newtype Ideal a = Ideal [a]
这样可以正常使用,但现在如果我尝试这样做会给我一个错误,比如说take 5 $ Ideal [0..]
。
有没有办法可以保留我想要的功能,只覆盖我明确覆盖的定义?
答案 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)