>>558
もっと単純な例を挙げる。

foo :: Int -> String -> Bool

という関数があるとする。これはもちろん二引数関数。
括弧を補って丁寧に書くと、この型は次のようになる。(納得できないならカリー化を復習すべし)

foo :: Int -> (String -> Bool)

ここで(String -> Bool)の部分を別名に置き換えても意味は変わらない。

type StringProp = String -> Bool
foo :: Int -> StringProp

こう書くとfooはいかにも一引数関数だけど、型は最初のfooと変わらない。
よって、実装を書く際は引数を二つ使える。例えば、

foo :: Int -> StringProp
foo n s = length s < n

ついでだが、
>関数定義に存在していないのが理解できません。
「update :: Assoc a b -> a -> b -> Assoc a b」みたいなのは型シグネチャといって、
ふつう定義とはいわないと思う。