あなたは、パターンの文脈では、(おそらく)で、書き換えルールと直接ないを明白な方法でこれを行うことができます。特に、左側のタイプのアプリケーションは完全に有効です。でもタイプのアプリケーションなし
{-# LANGUAGE TypeApplications #-}
module A where
{-# INLINE [1] myread #-}
{-# RULES "myread" forall s . myread @Int s = 0 #-}
myread :: Read a => String -> a
myread = read
は、次のようにも完全に有効です(ただし、出力タイプはf a
だった、あなたは、あなたが.. = (result :: [ _ ])
を持っていることができなかっただけでf
「最適化」したかった場合例えば、一般的にはできない場合があります):
{-# RULES "myread" forall s . myread s = (0 :: Int) #-}
そして、一例として
module B where
import A
fun :: String -> String -> (Int, Bool)
fun x y = (myread x, myread y)
ルール火災は常に(もちろん、コアを見ていることを証明を使用します省略無関係ビット):
fun4 :: Int
fun4 = I# 0#
fun :: String -> String -> (Int, Bool)
fun =
\ _ (w1 :: String) ->
(fun4,
case readEither6 (run fun3 w1) of _ {
[] -> fun2;
: x ds ->
case ds of _ {
[] -> x;
: ipv ipv1 -> fun1
}
})
注、これは正確に目標が何であるかを実際にコメントしていない私はよく分からないという理由だけ答えですが、コードはコメントに適合していないでしょう。
正しいツールを手元に持っているようです。つまり、 'a'のクラス制約です。もちろん、 'Read Int'インスタンスは制御しませんが、実際のユースケースでは、クラスの定義とインスタンスを制御しているようです。または、おそらく私はあなたが「最適化」することを誤解していますか? (脇に:私は 'x :: H a => T a'はコンテキスト" H a "ではなくタイプ" x "を意味するのではなく、タイプ" H "のx (Read a => F a) - > X 'には適用されません。 – user2407038
私は' Read'を制御しません。クラスであり、既に存在する場合、 'Int'のための自分自身の' Read'インスタンスを作ることはできません。多分私はあなたを誤解しています。 – Clinton