Как получается, что следующий тип проверяет
{-# 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?