С функциональными зависимостями я могу объявить класс Foo
:
class Foo a b c | a -> b where
foo1 :: a -> b -> c
foo2 :: a -> c
и когда я звоню foo2
, все работает нормально. Компилятор знает, какой экземпляр использовать из-за зависимости.
Но если я уберу зависимость для создания Foo'
:
class Foo' a b c where
foo1' :: a -> b -> c
foo2' :: a -> c
все по-прежнему компилируется нормально, но теперь всякий раз, когда я пытаюсь вызвать foo2'
, GHC выдает ошибку о невозможности решить, какой экземпляр использовать, потому что b
неоднозначен.
Можно ли когда-нибудь вызвать foo2'
без ошибок? Если да, то как? Если нет, то почему не выдает ошибку компиляции?
foo1
иfoo2
подразумевают разные типы дляa
. Вы имели в видуa -> b -> c
иa -> c
? - person Daniel Fischer   schedule 04.01.2013b
недоступен изfoo2'
, поэтому экземпляр можно было определить только в том случае, если существовал прямой способ указать экземпляр для использования. Это возможно с помощью некоторогоConstraintKinds
волшебства, я этого не знаю, но сомневаюсь. Итак, нет, вы никогда не сможете звонитьfoo2'
. Почему он не выдает ошибку компиляции, я точно не знаю, но думаю, компилятор не может доказать, что никогда нельзя однозначно вызватьfoo2'
. - person Daniel Fischer   schedule 05.01.2013