Идрис: Можно ли переписать все функции, используя "с", чтобы использовать "case" вместо "с"? Если нет, не могли бы вы привести контрпример?

Можно ли в Idris переписать все функции, используя " с", чтобы использовать "case" вместо "с"?

Если нет, не могли бы вы привести контрпример?

1 ответ

Решение

Невозможно. Когда вы образец соответствует withтипы в контексте обновляются информацией, извлеченной из соответствующего конструктора. case не вызывает такое обновление.

Например, следующее работает с with но не с case:

import Data.So

-- here (n == 10) in the goal type is rewritten to True or False
-- after the match
maybeTen : (n : Nat) -> Maybe (So (n == 10))
maybeTen n with (n == 10)
  maybeTen n | False = Nothing
  maybeTen n | True  = Just Oh

-- Here the context knows nothing about the result of (n == 10)
-- after the "case" match, so we can't fill in the rhs
maybeTen' : (n : Nat) -> Maybe (So (n == 10))
maybeTen' n = case (n == 10) of
  True  => ?a 
  False => ?b
Другие вопросы по тегам