- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个类似于 "3,4\r\n"
的字符串,我想将它们转换为一个元组,即 (3,4)
。
我们如何在 SML 中实现这一目标?
我获得字符串值的原因是因为我正在读取一个返回类似字符串的文件。
最佳答案
您需要一个简单的解析器来实现这一点。库中已经提供了解析整数的适当函数 Int.scan
(以及其他类型的 friend ),但你必须自己编写其余的内容。例如:
(* scanLine : (char, 's) StringCvt.reader -> (int * int, 's) StringCvt.reader *)
fun scanLine getc stream =
case Int.scan StringCvt.DEC getc stream
of NONE => NONE
| SOME (x1, stream') =>
case getc stream'
of NONE => NONE
| SOME (c1, stream'') =>
if c1 <> #"," then NONE else
case Int.scan StringCvt.DEC getc stream''
of NONE => NONE
| SOME (x2, stream''') =>
case getc stream'''
of NONE => NONE
| SOME (c2, stream'''') =>
if c2 <> #"\n" then NONE else
SOME ((x1, x2), stream'''')
然后,解析所有行:
(* scanList : ((char, 's) StringCvt.reader -> ('a, 's) StringCvt.reader) -> (char, 's) StringCvt.reader -> ('a list, 's) StringCvt.reader *)
fun scanList scanElem getc stream =
case scanElem getc stream
of NONE => SOME ([], stream)
| SOME (x, stream') =>
case scanList scanElem getc stream'
of NONE => NONE
| SOME (xs, stream'') => SOME (x::xs, stream'')
要使用它,例如:
val test = "4,5\n2,3\n"
val result = StringCvt.scanString (scanList scanLine) test
(* val result : (int * int) list = [(4, 5), (2, 3)] *)
正如您所看到的,代码有点重复。要摆脱选项类型的所有匹配,您可以编写一些基本的解析器组合器:
(* scanCharExpect : char -> (char, 's) StringCvt.reader -> (char, 's) StringCvt.reader *)
fun scanCharExpect expect getc stream =
case getc stream
of NONE => NONE
| SOME (c, stream') =>
if c = expect then SOME (c, stream') else NONE
(* scanSeq : ((char, 's) StringCvt.reader -> ('a, 's) StringCvt.reader) * ((char, 's) StringCvt.reader -> ('b, 's) StringCvt.reader) -> (char, 's) StringCvt.reader -> ('a * 'b, 's) StringCvt.reader *)
fun scanSeq (scan1, scan2) getc stream =
case scan1 getc stream
of NONE => NONE
| SOME (x1, stream') =>
case scan2 getc stream'
of NONE => NONE
| SOME (x2, stream'') => SOME ((x1, x2), stream'')
fun scanSeqL (scan1, scan2) getc stream =
Option.map (fn ((x, _), stream) => (x, stream)) (scanSeq (scan1, scan2) getc stream)
fun scanSeqR (scan1, scan2) getc stream =
Option.map (fn ((_, x), stream) => (x, stream)) (scanSeq (scan1, scan2) getc stream)
(* scanLine : (char, 's) StringCvt.reader -> (int * int, 's) StringCvt.reader *)
fun scanLine getc stream =
scanSeq (
scanSeqL (Int.scan StringCvt.DEC, scanCharExpect #","),
scanSeqL (Int.scan StringCvt.DEC, scanCharExpect #"\n")
) getc stream
您可以沿着这些思路构建更多很酷的抽象,特别是在定义您自己的中缀运算符时。但我就这样吧。
您可能还想处理标记之间的空白。 StringCvt.skipWS
库中可以轻松使用 reader,只需将其插入到正确的位置即可。
关于sml - 如何在 SML 中将 String 解析为 (int * int) 元组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14750444/
在 OCaml 中,函数应用程序的评估顺序是未指定的(又名非确定性的)。 在标准机器学习中,它也是非确定性的还是确定性的?您能否提供对规范部分进行澄清的引用? 编辑:对于那些稍后来的人,我还了解到,与
我是 SML 的新手,正在使用 SMLNJ 方言。 出于某种目的,我一直在尝试将 3 类型转换为 3.0(int 到 real)。 找不到出路。我怎样才能做到这一点?如何在类型之间进行转换? 最佳答案
SML中有标准的排序函数吗?互联网上的文档太少了,我找不到任何文档。 最佳答案 SML 基础库中没有定义排序功能,但大多数实现都扩展了基础库并添加了额外的功能。 因此,MosML 具有 ArraySo
1 fun max(a,b,c) = 2 if a > b a
SML长度函数: fun length(L) = if (L=nil) then 0 else 1+length(tl(L)); 例如: length [1,2,3] = 3; len
这里的第一个问题只是想作为我做了几个查询的序言,虽然我发现了多个措辞相似的问题,但我发现没有一个问题在问或回答我的问题(据我所知)。 我正在 SML 中进行类作业,因此我将省略一些细节,以便我可以自己
我正在使用带有 SML 模式的 Emacs。有时我需要清理 SML 缓冲区。我怎样才能做到这一点。 最佳答案 新泽西标准 ML 是一种函数式编程语言,它是 ML 的变体。通常它在带有插件的 EMACS
我相信我对在 SML 中捕获异常有一些基本的误解。 我写了下面的代码: fun my_g acc p = let val r = my_g acc in ca
我目前在 SML 代码中有很多打印语句,而且我正在遍历一个非常大的树,所以打印所有打印语句需要一段时间,但现在我不想看到任何打印语句和只是想看到它尽可能快地运行。但我不想评论所有的打印,因为我以后需要
我正在使用 SML/NJ,我需要使用某个文件中的一组函数 f1.sml在另一个文件中 f2.sml . 但是,我没有运行 f2.sml直接,相反,我从其他地方导入它。 如果我使用 use f2.sml
fun p( x::xl ) = if x::xl = [] then [] else [0]; 它收到警告:匹配非详尽无遗。 x::xl => ... 我想做的是: p( [] ) = []
我有这个声明: let val x = let val x = 5 in(fn y =>(y,x+y)) end in let val y=3 and z=
有没有办法使用 SML 打印完整列表? 通常在 SML 中发生的情况是,当我有太多元素时,它会打印由“,”分隔的前几个元素,然后用 ... 省略列表的其余部分,但我想看看完整列表。有什么办法吗? va
我正在尝试读取我的输入文件的名称 argv[1] 。这是我到目前为止所做的: val args = CommandLine.arguments() ; val (x::y) = args ; val
我如何转换 array输入 list输入 sml。我已经搜索了列表和数组结构函数,但没有找到执行此操作的函数(尽管有一个数组函数列表)。 列表结构说明: http://sml-family.org/B
我目前正在为 SML 类(class)的作业评分。我编写了一些测试用例来自动检查学生作业中函数的正确性,我希望能够导入他们的代码,然后针对该代码运行测试用例。我正在想象类似于 python 导入语义的
如何将命令行参数传递给 SML 脚本?我知道有一个 CommandLine.arguments()正确类型的函数( unit -> string list ),但像这样调用解释器: $ sml scr
假设我在 sml 中有一个非常大的列表,然后 sml 显示一些条目,然后开始显示 # 字符。 有人能告诉我如何查看整个列表吗? 最佳答案 假设这是 SML/NJ,您可以使用 printLength ,
我有以下公式 fun foo 0 = [0] | foo num = let val l = (num mod 2)::foo(num div 2) in rev l
我有一个关于我的作业的问题,问题是 有使用数据类型: datatype 'a llist = LList of 'a llist list| Elem of 'a; 嵌套列表由多态类型的元素或嵌套列表
我是一名优秀的程序员,十分优秀!