2016-03-21 4 views
1

Есть ли способ, чтобы компилятор получить функциональные возможности, которые я хотел бы написать вручную:Автоматического Haskell получения декларации, поднимающая

instance Class c => Class (Trans c) where 
    foo1 = lift foo1 
    foo2 = lift foo2 
    ... 
    foo999 = lift foo999 
    bar1 = \a b c -> lift $ bar1 a b c 
    ... 
    baz1 = lift . baz1 
    ... 

т.е. когда тип класса Class в настоящее время завернутые в Trans, возможно получить бесплатный экземпляр Class для Trans автоматически без необходимости выполнять тяжелый подъем :)?

+2

Я не уверен, что понял то, что вы на самом деле хотите. Этот экземпляр будет работать на всех 'c', поэтому вам нужно только написать его один раз. Я не думаю, что это может быть сделано короче, в общем случае. – chi

+0

Но экземпляр скучный (он просто делает лифтинг для всех функций), возможно, можно было бы написать это кратко (не перечислив все 'fooX = lift fooX' и т. Д.) – jakubdaniel

+1

Я вижу, но любая альтернатива (например, Шаблон Haskell) выглядит хуже, если у вас действительно нет большого количества методов класса. – chi

ответ

1

Если lift сам по себе является функцией класса типа, вы можете написать общее определение для всех экземпляров класса type. Что-то вроде:

instance (Class c, Trans t) => Class (t c)

Будьте осторожны, что это не пересекаться с любыми другими экземплярами, и это то, что вы хотите для всех этих типов.

Как более полный пример, этот код работает, хотя его результаты иногда удивляют.

{-# LANGUAGE FlexibleInstances #-} 

module Inst where 

import Control.Applicative (liftA2) 

instance (Applicative f, Num n) => Num (f n) where 
    (+) = liftA2 (+) 
    (*) = liftA2 (*) 
    abs = fmap abs 
    signum = fmap signum 
    fromInteger = pure . fromInteger 
    negate = fmap negate 
+0

Запись экземпляра для применения переменной типа к чему-то * почти никогда * право подход, поэтому мне не особенно нравится это предложение. – dfeuer

+0

Мне действительно нужен конкретный экземпляр для самого нижнего трансформатора, и я бы использовал подъем только в остальных трансформаторах. – jakubdaniel

 Смежные вопросы

  • Нет связанных вопросов^_^