如何修复agda

时间:2018-04-24 02:22:33

标签: functional-programming agda

以下是自定义agda库的代码。在下面的代码中,代表向量,ℕ代表自然数。 take类型与Haskell类似。示例:“在[1,2,3]中取3 [1,2,3,4,5,6,7,8]个结果。

take : ∀{A : Set}{n : ℕ} → (m : ℕ) →  A n →  A m
take 0 xs = []
take (suc m) (x :: xs) = x :: take m xs

我一直收到错误:

  

不完整的模式匹配。遗失案件:
         采取(成功   m)[]检查take的定义

我不明白,我可能错过了什么可能的证据。

2 个答案:

答案 0 :(得分:2)

take的类型签名表示,对于任何完全不受约束的m,您可以返回长度为Vec m Vec n m 1}}。当然,这不是正确的,因为n必须小于或等于Vec,因为您要返回Vec的前缀。由于要采用的元素数量和m的长度彼此无关,因此Agda会为您提供有关不完整模式匹配的错误。

在Agda标准库中,Vec小于或等于输入take : ∀ {a} {A : Set a} m {n} → Vec A (m + n) → Vec A m 长度的限制表示如下:

take : ∀ {a} {A : Set a} {m n} → m ≤ n → Vec A n → Vec A m

您还可以定义类似

的内容
take : ∀ {a} {A : Set a} m {n} → Vec A n → Vec A (m ⊔ n)

甚至

Data.List.take

模拟_⊔_的行为(其中min表示Agda stdlib中的$textAreas = TextAreas::getAllTextAreas(); $response = Yii::$app->response; $response->format = Response::FORMAT_JSON; return ArrayHelper::toArray($textAreas, [ TextAreas::class => [ 'id', 'width', 'height', 'content' => function ($data) { return $data->text->text; }, ], ]); )。

答案 1 :(得分:1)

您是@POST @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Response getElementsSearch(SearchRequestObject sro) { Session session = SessionUtil.getSession(); FullTextSession fullTextSession = Search.getFullTextSession(session); . . . }catch(Exception e) { return Response.status(Response.Status.INTERNAL_SERVER_ERROR).entity(e).build(); }finally { session.clear(); session.close(); } } 上的模式匹配和m类型的向量xs。由于 A nm,因此无法保证suc非空。如错误所示,您还需要考虑xsmsuc为空的情况。

或者,您可以编写一个更精确类型的函数,以确保xs至少与xs一样长。这是标准库中使用的内容:

m