2012-01-01 13 views
4

HaskellのGeneralizedNewtypeDerivingメカニズムは素晴らしいです。それを見ていない人のために、GeneralizedNewtypeDerivingインスタンスの1つまたは2つのメソッドをカスタマイズする方法はありますか?

newtype SkewOptT α = SkewOptT (StateT Bool α) 
    deriving (Applicative, Functor, Monad, MonadTrans) 

のようなものを書くことは、自動的に

instance [overlap ok] Monad => Monad (SkewOptT) 

、のようなインスタンスを生成しますが、私の型クラスの1のために、私はいくつかのメソッドをカスタマイズしたいです。これらのメソッドに対してGeneralizedNewtypeDerivingの機能を無効にするか、無効にする方法はありますか? typeclassは、for(ループ)、parfor(並列ループ)、fcndef(新しい関数を追加する)などのいくつかの基本的なDSL命令をエンコードします。そして、それを複数のタイプメスに分割する完全な方法はありません。自動的に1つを派生させ、もう1つは手作業で書く。

+0

[その文字](http://www.fileformat.info/info/unicode/char/d52a/index.htm)とは何ですか? – ehird

+1

@ehirdはFraktur 'm'のように見え、私にとってはアルファです。 –

+0

ああ、ありがとう。何か(飛行機関連、私が疑う)は、私がそれを探したときに間違っていたに違いない。 – ehird

答えて

4

いいえ、これはできません。 Default signatures(GHC 7.2の新機能)は、ここでクラスを分割するのに役立ちます。メソッドのデフォルトの実装を他のタイプメッシュの観点から定義することができるので、いくつかのインスタンスを派生させ、別のクラスのインスタンスでオーバーライドするメソッドだけを埋め込むことができます。

実際には、newtypeはいくつかの前提条件が満たされているかどうかを確認してから、辞書を直接再利用します(newtypeは基になる型と同じ表現を持つため)。詳細はthe documentationを参照してください。

+0

私は既定の署名でそれを行うことができるか分からない。デフォルトのシグネチャは、newtypeについて認識しません。 (基本タイプなど)。うまくいけば、後でHaskellを繰り返し実行すると、私のようなData.GenericsやTemplate Haskellでうまくいかない人たちのために、より簡単にプログラマブルな導出機構が得られることを願っています。 – gatoatigrado

+2

GHC 7.2の新しい[ジェネリックメカニズム](http://www.haskell.org/ghc/docs/latest/html/users_guide/generic-programming.html)(デフォルトのシグネチャが導入された)を使用したことはありますか? – ehird

関連する問題