2012-01-27 3 views
21

Часто, когда я играю с кодом Haskell, я закрываю вещи аннотацией типа и undefined.Не определено на уровне уровня

foo :: String -> Int 
foo = undefined 

Есть ли «неопределенный» тип уровня, который я мог бы использовать аналогичным образом?

(В идеале, в сочетании с доброй аннотацией)

type Foo :: * -> * 
type Foo = Undefined 

Далее мысль о том же потоке: есть ли способ для меня, чтобы погасить окурок экземпляров для класса типов типов, созданных таким образом? Еще проще, чем следующий теоретический путь?

instance Monad Foo where 
    return = undefined 
    (>>=) = undefined 

ответ

24

Вы можете использовать EmptyDataDecls незавершенные из типа, и с KindSignatures вы можете дать ему вид:

{-# LANGUAGE EmptyDataDecls, KindSignatures #-} 

data Foo :: * -> * 

Вы также можете гасите экземпляр Monad без предупреждений с помощью этой опции в GHC.

{-# OPTIONS_GHC -fno-warn-missing-methods #-} 

instance Monad Foo 

И тогда вам не нужно покидать любую реализацию для return и >>=.

+1

Ницца! Именно то, что я искал; это еще более удобно, потому что вам не нужно писать 'Foo = Undefined'! И добрые подписи! Awesomesauce. –

+0

Я считаю, что это не то же самое, что псевдоним типа - когда вы вводите новые данные, нет никаких шансов, что 'Foo a = a'. Таким образом, это не то же самое, что код вопроса, и это может быть хорошо. – gatoatigrado

+0

@gatoatigrado: Я думаю, что это требование было просто заполнителем для типа, который еще не написан, а не как псевдоним типа per se, а затем это подходящее решение. В любом случае, рад помочь вам Дэн! – danr

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