1

f私はで使用する関数を書きましたfoldM

foldM (f xs) [] ids
...
f xs acc id = case lookup id xs of
    Just x -> return $ acc ++ [(id, x)]
    Nothing -> throwError $ TypeError "Cannot project nonexisting field"

私が書いた型シグネチャは次のとおりです。

[(String, Value)] -> [(String, Value)] -> String -> EvalMonad [(String, Value)]

次に、型シグネチャを削除することにしました。これは、関数が単純であり、そのままで十分に説明的であるためです。hdevtools を使用して推定型を取得したところ、

[(t, t)] -> [(t, t)] -> t -> m [(t, t)]

これは何ですか?t は通常とは異なる、aまたはb一般的に見られるものと推測しています。タプルの最初と 2 番目の要素は同じ型ではありません (いいえ、SValue は String の型シノニムではありません) が、この署名はその制約を暗示しています。また、モナド m にクラス制約がないのはなぜですか? ここでは EvalMonad スタック全体を使用していませんがm、少なくともMonadError.

4

1 に答える 1