Как именно работают синонимы типов?

Как получается, что следующий тип проверяет

{-# LANGUAGE RankNTypes #-}
module Main where

class Foo a where


type FunFoo = (Foo a) => a -> IO ()

data Bar = Bar {
  funFoo :: FunFoo
}

setFunFoo :: FunFoo -> Bar -> Bar
setFunFoo action bar = bar {funFoo = action}

, но при изменении сигнатуры типа с setFunFoo на

setFunFoo :: ((Foo a) => a -> IO ()) -> Bar -> Bar

этого не происходит? Есть ли способ выразить приведенный выше код без синонима типа FunFoo?

7
задан Don Stewart 7 May 2011 в 03:11
поделиться