我正在寻找以下签名的函数
val suffix : t -> int -> t
suffix s n
返回 s
的长度小于或等于 n
的最长后缀
标准String模块提供这样的功能吗?如果有的话,如何使用?
我需要排除字符串的第一个字符并使用其余字符,即从最长的正确后缀构造一个字符串。给定
"abc"
,我需要一个字符串"bc
”。我尝试了以下操作,但失败了
String.suffix s ((String.length s) - 1)
出现以下错误。
Error: Unbound value String.suffix
如何打开模块并使用它?
open String
和 open Core.Std
失败。
预期的函数签名是从这里复制的。
仅使用标准 OCaml 库中的
String
和 Seq
模块:获取字符串的长度,将字符串转换为序列,删除第一个字符,然后删除除 n
之外的所有字符。然后将其转换回字符串。
let suffix s n =
let len = String.length s in
s
|> String.to_seq
|> Seq.drop 1
|> Seq.drop (len - n - 1)
|> String.of_seq
# suffix "abc" 2;;
- : string = "bc"
# suffix "abcd" 2;;
- : string = "cd"
# suffix "abcd" 3;;
- : string = "bcd"
# suffix "ab" 2;;
Exception: Invalid_argument "Seq.drop".
有效!直到没有。我们可以通过简单的检查来解决这个问题。
let suffix s n =
let len = String.length s in
if len <= n then
""
else
s
|> String.to_seq
|> Seq.drop 1
|> Seq.drop @@ len - n - 1
|> String.of_seq
# suffix "ab" 2;;
- : string = ""
# suffix "abc" 2;;
- : string = "bc"