2017-01-25 40 views
1

私は、パレートメーターとしてそれらを管理する関数を受け取ることによって、一連の状態にわたって異なるアルゴリズムを実行するモジュールを開発しようとしています。私は実装しやすくするために別の型のエイリアスを定義していました。これは次のようになり理解するための簡単な例:型エイリアス宣言のHaskell型クラス

-- Function that expands a state 
type Expand = State -> State 
-- Function that evaluates a state 
type Eval = State -> Float 
-- Group of states 
type Tree = [State] 

そして私は私がequatableあるタイプの別名であることをStateを望んでいたことに気づい:ユーザーの状態が(Int, Int)Floatある場合、私は本当に気にしません、彼はExpandEvalの機能を実装することができ、2つの異なる状態を比較することができる限り、Stringとなります。

これを達成するには、どのようにしてStateタイプを一般化できますか?わたしの心に来る直感的なことは、type State = (Eq a) => aのようなものですが、それは明らかに範囲内にaがなければ不可能です。 Stateをブラックボックスとして扱う関数を宣言するための簡単な方法はありますか?

答えて

4

タイプパラメータとしてジェネリックステートを含める必要があります。

type Expand s = s -> s 
type Eval s = s -> Float 
type Tree s = [s] 

これは完全に非表示にすることはできません。 (Int, Int)状態の場合はExpandString状態の場合とまったく異なるタイプです。

Eqと同様です。通常、制約を必要とする特定の関数にのみローカルに含めることになります。