Idris中的隐式参数

时间:2018-07-12 07:43:01

标签: idris

我需要一些帮助来解释有关Idris中隐式参数的错误消息以及为什么要进行较小的更改才能解决该错误消息。这是代码:

openssl_pkey_new(array("digest_alg" => "sha512","private_key_bits" => 4096,"private_key_type" => OPENSSL_KEYTYPE_RSA,));

它导致此错误:

import Data.Vect

myReverse : Vect n elem -> Vect n elem
myReverse [] = []
myReverse {n} (x :: xs)
  = let result = myReverse xs ++ [x] in
                 ?rhs

但是,将When checking left hand side of myReverse: When checking an application of Main.myReverse: Type mismatch between Vect (S len) elem (Type of x :: xs) and Vect n elem (Expected type) Specifically: Type mismatch between S len and n 替换为{n},代码会进行类型检查。

  1. 我认为使用{n = S len}只是意味着将函数的隐式{n}参数带入范围。为什么会导致错误?

  2. 错误消息是什么意思?我能想到的唯一解释是,由于将模式n匹配到n中,类型中的隐式参数x::xs被重写,并且Idris丢失了这些相同的信息。 / p>

  3. 如何用S len替换它?

1 个答案:

答案 0 :(得分:2)

在这些情况下,您最好的选择是使用idris为您进行编程。如果您以

开头
myReverse : Vect n elem -> Vect n elem
myReverse {n} xs = ?myReverse_rhs

现在在xs上区分大小写

myReverse : Vect n elem -> Vect n elem
myReverse {n = Z} [] = ?myReverse_rhs_1
myReverse {n = (S len)} (x :: xs) = ?myReverse_rhs_2

所以idris不仅在xs上进行大小写拆分,而且还在n上进行大小写拆分,因为对于空向量,长度必须为Z,对于非空向量,长度必须至少为S len。这也意味着xs现在的长度为len。

由于n也在函数的右侧,所以很显然,您需要为myReverse_rhs_2提供某些东西,当您进行正确的模式匹配时,它的长度S len等于n。

在错误消息中,idris不知道n是什么,因此该消息。