Как использовать цепочку экземпляров для решения перекрытия - PullRequest
0 голосов
/ 11 мая 2018

Я пробовал следующий purescript версии 0.12.0-rc1.
У меня есть вопрос, как использовать новую функцию «цепочка экземпляров».
В моем понимании цепочка экземпляров предоставляет возможность явно указывать порядок разрешения экземпляров. это решает проблему с перекрытием определения экземпляра.

так что я полагаю, что это может сработать:

class A a
class B b
class C c where
  c :: c -> String

instance ca :: A a => C a where
  c = const "ca"
else
instance cb :: B b => C b where
  c = const "cb"

data X = X
instance bx :: B X

main :: forall eff. Eff (console :: CONSOLE | eff) Unit
main = logShow $ c X

, но не может быть скомпилировано.

что не правильно? или что такое цепочка экземпляров?

результат:

Error found:
in module Main
at src/Main.purs line 23, column 8 - line 23, column 20

  No type class instance was found for

Main.A X


while applying a function c
  of type C t0 => t0 -> String
  to argument X
while inferring the type of c X
in value declaration main

where t0 is an unknown type

1 Ответ

0 голосов
/ 12 мая 2018

Даже при сопоставлении цепочек экземпляров все еще выполняется в заголовке экземпляра. В случае сбоя какого-либо ограничения для выбранного экземпляра "обратного отслеживания" не происходит.

Ваши экземпляры полностью перекрываются на голове, поэтому ваш первый экземпляр всегда совпадает с первым, и происходит сбой, потому что для X.

нет экземпляра A.

Цепочки экземпляров позволяют вам определить явный порядок разрешения экземпляров, не полагаясь, например, на алфавитный порядок имен и т. Д. (Как это было до версии 0.12.0 - , пожалуйста, проверьте третий абзац здесь ). Например, вы можете определить этот сценарий перекрытия:

class IsRecord a where
   isRecord :: a -> Boolean

instance a_isRecordRecord :: IsRecord (Record a) where
   isRecord _ = true

instance b_isRecordOther :: IsRecord a where
   isRecord _ = false

в

instance isRecordRecord :: IsRecord (Record a) where
   isRecord _ = true
else instance isRecordOther :: IsRecord a where
   isRecord _ = false

Надеюсь, он скомпилируется - у меня еще нет purs-0.12.0-rc -)

...