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
.