Я действительно запутался в неявных параметрах.А именно в b
функции / доказательстве ниже.
В этом видео , которое я пытаюсь глубоко понять, я натыкаюсь на этот момент: у нас есть неявное {p}
до String s
в определении связывания b {p} s
.
b : (s : String) -> {p : Every BinChar (unpack s)} -> Nat
b {p} s = fromBinChars p (length s - 1)
Я вижу, что он прекрасно компилируется.Но я ожидал, что p будет на второй позиции:
b s {p} = fromBinChars p (length s - 1)
или даже (поскольку p
неявно и уже определено / предполагается в сигнатуре типа)
b s = fromBinChars p (length s - 1)
Почему это не так?Какие концепции, по вашему мнению, я неправильно понимаю?
Это остальная часть кода:
data BinChar : Char -> Type where
O : BinChar '0'
1 : BinChar '1'
data Every : (a -> Type) -> List a -> Type where
Nil : {P : a -> Type} -> Every P []
(::) : {P : a -> Type} -> P x
-> Every P xs
-> Every P (x :: xs)
fromBinChars : Every BinChar xs -> Nat -> Nat
fromBinChars [] k = k
fromBinChars (O :: z) k = fromBinChars xs (k - 1)
fromBinChars (I :: z) k = pow 2 k + fromBinChars xs (k - 1)