2012-01-27 13 views
21

私はハスケルコードで遊んでいるときに、しばしば型名と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 :: * -> * 

あなたはまた、GHCには、このオプションを使用して警告なしMonadインスタンスをスタブアウトすることができます。

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

instance Monad Foo 

そして、あなたはreturn>>=のための任意の実装を残しする必要はありません。

+1

ニース!まさに私が探していたもの。 'Foo = Undefined'を書く必要がないので、さらに便利です!そして、一種の署名!素晴らしい醤油。 –

+0

私はそれが型エイリアスと同じではないと信じています。あなたが新しいデータを導入すると、 'Foo a = a'ということはありません。だから、質問のコードと同じではありませんが、これは問題ありません。 – gatoatigrado

+0

@gatoatigrado:私は、この要件は、タイプエイリアスではなく、まだ書かれていないタイプのプレースホルダであったと考えています。そして、これが適切な解決策です。とにかく、ダンを助けてうれしい! – danr