2016-12-11 5 views
1

PureScriptでマルチパラメータタイプクラスを使用することは妥当ですか?マルチパラメータタイプクラスで 'タイプクラスインスタンスが見つかりませんでした'

コンパイラは以下のタイプのクラス定義の不合理「は型クラスのインスタンスが見つかりませんでした」エラー(full outputを参照)を上昇させる。

class Transform model turn where 
    transform :: turn -> model -> model 
    delay :: Maybe turn -> Int 

にエラーがないdelay関数の定義から生じますタイプパラメータmodelに依存します。上にリンクされたコンパイラ出力から明らかなように、不在モデルにはt0を代入します。

これを修正する適切な方法は何ですか?現在、私は以下のようにturnの種類を変更することでこの問題を回避:FPスラックチャネルから

class Turnable model turn where 
    runTurn :: turn model -> model -> model 
    turnDelay :: Maybe (turn model) -> Int 

答えて

1

rightfoldは、この答えを与えた:

fundepに| turn -> model

を追加し、インスタンスが検索されますのみを介してturn

私はタイプクラスの定義を変更しましたこれまでに:

class Turnable model turn | turn -> model where 
    runTurn :: turn -> model -> model 
    turnDelay :: Maybe turn -> Int 

これはコンパイラを幸せにしました。詳細については、Haskell wikiのFunctional dependencies(fundep)および24 days of PureScript postを参照してください。

0

...昔は、コンパイラがどのインスタンスを選択するかを決定するためにプロキシ(https://github.com/purescript/purescript-proxy)を使用していました。例: :

turnDelay :: Proxy model -> turn -> Int 
turnDelay _ turn = ..... 

とプロキシに渡すことで、それを呼び出す:

turnDelay (Proxy :: Proxy FooModel) barTurn 

私はFunDepsが行くための正しい方法です同意します。

関連する問題