Haskell newtype,但保留旧功能

Xod*_*rap 8 haskell

我想定义一种"理想"类型,它是一个列表,但有一些结构.数字前奏已经定义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)

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


ham*_*mar 6

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

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

{-# LANGUAGE GeneralizedNewtypeDeriving #-}
newtype MyState a = MyState (State Int a)
    deriving (Monad)
Run Code Online (Sandbox Code Playgroud)