2011-08-25 12 views
8

Quiero definir un tipo de "Ideal" que es una lista pero con cierta estructura. El preludio numérico ya define instancias de Ring para las listas, pero no están usando las definiciones de suma y multiplicación que quiero. Así que creo que en este caso debería decirHaskell newtype, pero conserva las funciones anteriores

newtype Ideal a = Ideal [a] 

Esto funciona bien, pero ahora me da un error si trato de hacer, decir take 5 $ Ideal [0..].

¿Hay alguna manera de que pueda mantener las funciones que quiero y solo anular las definiciones que anulo explícitamente?

Respuesta

6

Para funciones simples, no. Tendrás que proporcionar tus propias definiciones.

Sin embargo, para las funciones que pertenecen a una clase de tipo, puede usar la extensión GeneralizedNewtypeDeriving para exponer las clases de tipo que desee del tipo subyacente de newtype.

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

Si usted no está demasiado fijan en las cosas que son completamente automática, puede utilizar las funciones de utilidad en the newtype package, por ejemplo, algo así como over Ideal $ take 5.

Editar: Además, como un lado, no es demasiado difícil extender las funciones del paquete newtype para manejar otros casos. Por ejemplo, tuve estas definiciones por el sistema:

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 

No es en realidad el mejor diseño para este tipo de combinadores, sospecho, pero se entiende la idea.

Cuestiones relacionadas