LINUX.ORG.RU

История изменений

Исправление quasimoto, (текущая версия) :

это лишь ограничение GHC, а на самом деле никаких логических противоречий в наличии такой возможности нет, верно ?

Ну, если написать

IntegralInstance :
  {A : Set} {n : ℕ} ⦃ multipable-iface : Multipable n ⦄ ⦃ integral-iface : Integral A ⦄
  → Multiple n A ≤ A
IntegralInstance {n = n} ⦃ multipable-iface = mi ⦄ ⦃ integral-iface = if ⦄ = record
  { sup = {!!}
  ; sub = {!!}
  }

RealFracInstance :
  {A : Set} {n : ℕ} ⦃ multipable-iface : Multipable n ⦄ ⦃ realfrac-iface : RealFrac A ⦄
  → Multiple n A ≤ A
RealFracInstance {n = n} ⦃ multipable-iface = mi ⦄ ⦃ realfrac-iface = rfi ⦄ = record
  { sup = {!!}
  ; sub = {!!}
  }

то при использовании, например, Multiple 2 Int ≤ Int можно найти в контексте A ~ Int, n ~ 2, Multiple 2 Int ≤ Int, Multipable 2 и Integral Int и не найти того же для RealFracInstance - всё получается хорошо. Агда сейчас так не умеет, точнее, она делает именно так, но плоско, то есть для простых инстансов - я могу написать в глобальный контекст int-is-num : Num Int и оно будет неявно подбираться, потом написать int-is-num-again : Num Int и будет ошибка, так что нужно явно указать какой инстанс я хочу (и тут ошибок уже не будет - может существовать сколько угодно перекрывающихся инстансов если они используются явно, конфликты нужно разрешать при неявном использовании). Если сделать более глубокий поиск - твой пример будет работать до тех пор пока точно так же можно найти в контексте однозначный (уникальный) набор «инстансов».

Исходная версия quasimoto, :

это лишь ограничение GHC, а на самом деле никаких логических противоречий в наличии такой возможности нет, верно ?

Ну, если написать

IntegralInstance :
  {A : Set} {n : ℕ} ⦃ multipable-iface : Multipable n ⦄ ⦃ integral-iface : Integral A ⦄
  → Multiple n A ≤ A
IntegralInstance {n = n} ⦃ multipable-iface = mi ⦄ ⦃ integral-iface = if ⦄ = record
  { sup = {!!}
  ; sub = {!!}
  }

RealFracInstance :
  {A : Set} {n : ℕ} ⦃ multipable-iface : Multipable n ⦄ ⦃ realfrac-iface : Integral A ⦄
  → Multiple n A ≤ A
RealFracInstance {n = n} ⦃ multipable-iface = mi ⦄ ⦃ realfrac-iface = rfi ⦄ = record
  { sup = {!!}
  ; sub = {!!}
  }

то при использовании, например, Multiple 2 Int ≤ Int можно найти в контексте A ~ Int, n ~ 2, Multiple 2 Int ≤ Int, Multipable 2 и Integral Int и не найти того же для RealFracInstance - всё получается хорошо. Агда сейчас так не умеет, точнее, она делает именно так, но плоско, то есть для простых инстансов - я могу написать в глобальный контекст int-is-num : Num Int и оно будет неявно подбираться, потом написать int-is-num-again : Num Int и будет ошибка, так что нужно явно указать какой инстанс я хочу (и тут ошибок уже не будет - может существовать сколько угодно перекрывающихся инстансов если они используются явно, конфликты нужно разрешать при неявном использовании). Если сделать более глубокий поиск - твой пример будет работать до тех пор пока точно так же можно найти в контексте однозначный (уникальный) набор «инстансов».