如何证明原始字符串的内容?

时间:2018-01-05 09:38:48

标签: idris

在Idris上,无法对原始字符串执行模式匹配。因此,如何证明这些事情并不明显。例如,此函数可能会返回一个证明,即字符列表中的第一个字符是' a':

f : (l : List Char) -> Maybe (head' l = Just 'a')
f ('a' :: []) = Just Refl
f xs          = Nothing

这很简单,并通过了类型检查器。但是,如果我们尝试为本地字符串实现相同的功能,我们将编写如下内容:

g : (s : String) -> Maybe (prim__strHead s = 'a')
g s = if prim__strHead s == 'a'
  then Just Refl 
  else Nothing

未能进行类型检查,因为编译器显然不能仅仅通过prim__strHead s == 'a'测试来结束prim__strHead s == 'a'

因此,证明原始字符串的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

正如IRC上所建议的那样,您可以使用Data.String.Views.strList模式匹配字符串:

import Data.String.Views

g : (s : String) -> ...
g s with (strList s) 
 g ""            | SNil = ?no
 g (strCons x _) | SCons x _ with (decEq x 'a') 
   g (strCons 'a' _) | SCons 'a' _ | Yes Refl = ?yes
   g (strCons  x  _) | SCons  x  _ | No contra = ?no2