如何明确提供隐式参数?

时间:2015-04-28 02:28:26

标签: idris

假设我有一个带有此签名的函数:

myNatToFin : (m : Nat) -> (n : Nat) -> { auto p : n `GT` m } -> Fin n

我尝试在另一个函数的主体中像这个myNatToFin k (S k)一样应用它,我得到错误:

Can't solve goal 
            GT (S k) k

所以,我相信我必须明确传递GT (S k) k的证据,但我不知道如何做到这一点。如何显式传递隐式证明参数以便编译?

1 个答案:

答案 0 :(得分:3)

您可以为隐式参数提供显式参数,方法是将它们括在大括号中,并使用参数名称作为前缀,如{p = someExpression foo}

完整示例:

import Data.Fin

myNatToFin : (m : Nat) -> (n : Nat) -> { auto p : n `GT` m } -> Fin n
myNatToFin m n = ?x -- See https://stackoverflow.com/questions/29908731/

lteRefl : LTE n n
lteRefl {n = Z} = LTEZero
lteRefl {n = S _} = LTESucc lteRefl    

foo : (k : Nat) -> Fin (S k)
foo k = myNatToFin k (S k) {p = LTESucc lteRefl}