SML检查字符串是否只包含数字

时间:2016-03-31 17:30:09

标签: string int sml

我想创建一个SML函数,它将根据它所接受的字符串返回true或false。如果它只有数字,它将返回true,否则返回false。

例如: “4124” - 真的

“543.234” - 假

“f42” - 假

“344g” - 假

我不擅长使用SML,我们非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

fun foo xs = length (List.filter (Char.isDigit) xs) = length xs;

fun boo xs = foo (explode xs);

根据需要重命名该功能。

fun boo xs = List.all (Char.isDigit) (explode xs)

也有效。

答案 1 :(得分:1)

定义

[loggers]
keys = transactions, ...

[logger_transactions]
level = WARN
handlers =
qualname = txn

(或类似的东西)既自然又优雅,但缺点是它扫描数据两次,一次创建字符列表,另一次检查所有这些字符是否都是数字。 SML的热切评估意味着即使第一个字符不是数字,也会创建整个列表。这将导致功能例如需要超过200,000步才能验证Moby Dick的文本不是全部数字。

解决方案是抵制爆炸弦。相反,使用索引。

首先引入一个函数是有帮助的,当函数val allDigits = List.all Char.isDigit o explode; 传递f时,一对整数int -> boola如果所有整数都返回true区间b满足谓词[a,b)

f

由于SML短路fun allInRange f (a,b) = if b <= a then true else f a andalso allInRange f (a+1,b); ,一旦在范围内找到andalso的反例(如果有的话),递归就会终止 - 否则它当然会返回f

最后,

true