如何证明关于原始字符串的事情?
How to prove things about primitive strings?
在 Idris 上,无法对原始字符串执行模式匹配。因此,如何证明关于它们的事情并不明显。例如,此函数可以 return 证明字符列表的第一个字符是 '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'
。
因此,证明原始字符串的正确方法是什么?
根据 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
在 Idris 上,无法对原始字符串执行模式匹配。因此,如何证明关于它们的事情并不明显。例如,此函数可以 return 证明字符列表的第一个字符是 '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'
。
因此,证明原始字符串的正确方法是什么?
根据 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