您的代码包含很多错误。我不知道是因为它再次输入stackoverflow,还是因为从视频中误读了示例。Afaik视频中的IDRIS版本相当旧,您还需要稍微调整代码以使其运行。
下面是一个工作示例:
%default total
data BinChar : Char -> Type where
O : BinChar '0'
I : 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 z (k `minus` 1)
fromBinChars (I :: z) k = pow 2 k `plus` fromBinChars z (k `minus` 1)
b : (s : String) -> {auto p : Every BinChar (unpack s)} -> Nat
b s {p} = fromBinChars p (length s `minus` 1)
test: b "101" = 5
test = Refl
关于你的问题2)
为什么我不能省略隐式参数并写
b s = fromBinChars p (length s - 1)
?这很简单——在这种情况下,右边没有所谓的P,你需要介绍一下
p
在左手边。
关于你的问题1)
我想保持参数的顺序将被认为是好的样式,并且通常也是必需的。但idris似乎对待隐式参数有点不同,所以在本例中并不重要。但我不赌。在这个例子中,我不认为交换参数背后有真正的意图。