我想创建一个SML函数,它将根据它所接受的字符串返回true或false。如果它只有数字,它将返回true,否则返回false。
例如: “4124” - 真的
“543.234” - 假
“f42” - 假
“344g” - 假
我不擅长使用SML,我们非常感谢任何帮助。
答案 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 -> bool
和a
如果所有整数都返回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