2017-03-29 12 views
2

showですが、Showクラス制約がないmaybeShow関数を書き込もうとしています。ここに私の試みがあります:クラス制約上の書き換えルール

しかし、このコードでは、書き換えルールは決して始動しないようです。

これは時々、表示可能なタイプのためにNothingを返すことがわかります。たとえば、Nothingを返す特定の型に特化していない非インライン関数では、maybeShowの使用を完全に想定しています。しかし、errorの出力に何かを追加するためにmaybeShowを使用しているので、それが必ずしもうまくいかないかどうかは関係ありません。

しかし、現時点ではそうではないように(たとえば、呼び出し関数にインライン展開されたときなど)、時にはうまく動作したいと思います。

書き換えルールを起動する方法についてのアイデアはありますか?これはwiki.haskell.orgに書いてありますが、GHC 6.6のアドバイスからはまだ有効であるかどうかはわかりません。

+0

リンクされたページが示すように、辞書が展開された後に規則が適用され、その後単純な構文チェックになるため、条件の存在を条件として条件付きで作成することはできません。 –

+0

あなたは何をしようとしているのか説明できますか? –

+0

show制約を必要とせずにデバッグ目的の変数を表示します( 'error'呼び出し)。 – Clinton

答えて

0

要件はまだわかりませんが、パラメトリック型のトレース値をトレースして多形関数のライブラリをデバッグするなど、次の2つ以外の解決策は考えられません。Show制約を追加すると、コードダウンストリーム。


単相型に書き換えルールを使用します。私は、デバッグの目的で、あなたはいくつかのタイプしか必要としないと仮定します。しかし、これはむしろ信頼性が低く、関数を明示的に特殊化する必要があるかもしれません。


おそらく、ブランケットオーバーラップ可能なインスタンスを持つ別のタイプのクラスで取得できます。

class MaybeShow a where 
    maybeShow :: a -> Maybe String 

instance {-# OVERLAPPABLE #-} MaybeShow a where 
    maybeShow _ = Nothing 

デバッグに使用するいくつかのタイプに特化しています。

instance MaybeShow Int where 
    maybeShow n = Just (show n) 

ただし、それでもそれを使用するすべての機能にMaybeShowという制約を追加する必要があります。ここで

あなたは、多くの場合、より簡潔なトップレベルの署名

myFun :: _ => a -> w a 
constrainedFun :: (_, RealConstraint a) => a -> b a 

この方法は、しかし、はるかに予測可能な動作という利点を有するを書くことPartialTypeSignaturesを使用することができます。