Haskell的“内置”字符串类型称为String
,实际上只是的列表Char
。实际上,如果您尝试Char
在GHCi提示符下输入的列表,它将以其String
语法打印回给您:
> ['a','b','c']
"abc"
对于“真实”代码,String
通常是一个糟糕的选择,因为它具有您希望通过字符链接列表获得的所有性能。但是,当您学习Haskell时,足以进行实验了。您可以在Text
稍后了解其他选择。
因为String
是char的列表,take
并且drop
像处理列表一样对其进行处理:
> take 3 [1,2,3,4,5]
[1,2,3]
> take 3 "abcde"
"abc"
它们作用于字符串的开始,所以如果你想要一个普通的子功能,你需要首先drop
你不想字符串的开始部分,然后take
你的子做想。例如,要"bc"
离开"abcde"
,您要删除"a"
:
> drop 1 "abcde"
"bcde"
然后采取"bc"
:
> take 2 (drop 1 "abcde")
"bc"
其余的只是数学运算-通常,第一个数字“ 2”应该是所需子字符串的长度。通常,第二个数字“ 1”应为起始位置(偏移量为零)。
因此,请尝试填写“ ???” 下面带有涉及m
和的表达式n
,如果您仍然受阻,请发表修改或后续问题:
substr :: Int -> Int -> String -> String
substr m n str = take ??? (drop ??? str)
感谢你的信息。我认为
take (n-m) (drop m str)
但是,会发生错误。变量不在范围内:substr :: [Char]-> Integer-> Integer-> t我上面的两行示例旨在放入“ xxx.hs”文件并进行加载。听起来您好像试图在GHCi交互式提示符下输入它。如果是这样,第一行将给出该错误。这个问题可能有帮助:stackoverflow.com/questions/45362445/…。
我可以再问一个吗?如何检查界限?例如,如果str的长度为15,则(n> m)&&(0 <m,n <15)必须为true
@CPUU不,您不能。新问题是新帖子。