-1

インタープリターから次のスニペットがあります。

type Ident = String
type Value = Int
type State = Ident -> Value

iniState :: State

iniState = \ident -> error "internal error initial state"


updateS :: State -> (Ident, Value) -> State

updateS s (ident, val) ident' | ident' == ident = val
                              | otherwise = s ident'

updateS のパターンの ident はどこから来るのですか?

4

2 に答える 2

3

3 番目の引数はIdent、 type 内の関数への引数からStateです。

Usingtypeは、別のタイプのシノニムを定義します (文字通りシノニムです)。つまり、次の型シグネチャはすべて同じです。

State -> (Ident, Value) -> State 
(Ident -> Value) -> (Ident, Value) -> (Ident -> Value)
(Ident -> Value) -> (Ident, Value) -> Ident -> Value

(完全な展開を行うためIdentStringValueを置き換えることもできます。)Int

最後のものは、 function 、 pair 、および singleのupdateS3 つのパラメーターを取ることができることを明確にしています。Ident -> Value(Ident, Value)Ident

于 2012-07-05T13:33:26.347 に答える
3

updateSは 3 つのパラメータを取る関数です。State型シグネチャの定義に置き換えると、次のようになります。

updateS :: (Ident -> Value) -> (Ident, Value) -> Ident -> Value

typeident'を持つ関数の 3 番目のパラメーターも同様Identです。

全体像を見ると、と のペアが新しいにupdateS変わります。どのようなが返されるかについて推論できます。を評価すると、ほとんどの状況と同じように動作する a が得られますが、それが に等しい引数で呼び出された場合は、 が返されます。State(Ident, Value)StateStateupdateS s (ident, val)Statesidentval

于 2012-07-05T13:33:39.080 に答える