我想定义一种"理想"类型,它是一个列表,但有一些结构.数字前奏已经定义Ring
了列表的实例,但它们没有使用我想要的加法和乘法的定义.所以我认为在这种情况下我应该说
newtype Ideal a = Ideal [a]
Run Code Online (Sandbox Code Playgroud)
这样可以正常工作,但是现在如果我尝试这样做会给我一个错误,比方说take 5 $ Ideal [0..]
.
有没有办法可以保留我想要的功能,只覆盖我明确覆盖的定义?
C. *_*ann 11
如果你没有太多的事情被设置完全自动的,你可以在使用的实用功能的newtype
包装,例如像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
Run Code Online (Sandbox Code Playgroud)
我怀疑,实际上并不是这种组合器的最佳设计,但你明白了.
对于普通功能,没有.您必须提供自己的定义.
但是,对于属于类型类的函数,可以使用GeneralizedNewtypeDeriving
扩展来从a的基础类型公开所需的类型类newtype
.
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
newtype MyState a = MyState (State Int a)
deriving (Monad)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
266 次 |
最近记录: |