我的问题就像这里的问题一样。
我正在处理一个 char 列表列表,我需要检查 1-9 在每个列表中使用一次,但在列表中的每个位置也使用一次。
我的代码如下所示:
infix member
fun x member [] = false
| x member (y::ys) = x = y orelse x member ys;
fun rscheck xs =
let
val ys = [#"1",#"2",#"3",#"4",#"5",#"6",#"7",#"8",#"9"]
in
ys member xs
end;
但这仅检查 1-9 是否是列表的成员,而不是它们是否位于不同列表中的相同位置。
我有使用这个功能的想法:
fun poslist xs n = map (fn x => List.nth (x , n)) xs;
(函数 poslist 应该返回列表 xs 的位置 n 中的任何内容,因此我可以隔离 char 列表列表中的各个列表),但是由于 poslist 返回一个 char 列表 rscheck 不能使用它,因为它需要一个字符列表列表。
1) 我可以改进 poslist 吗?
2) 如何修复 rscheck?
编辑
infix member
fun x member [] = false
| x member (y::ys) = x = y orelse x member ys;
fun samelist (x::xs) ys = x member ys andalso samelist xs ys
| samelist [] _ = true;
fun takelist xs n = map (fn x => List.nth (x , n)) xs;
fun reverse xs = List.tabulate (9 , fn x => takelist xs x);
fun rscheck xs =
let
val s = [#"1",#"2",#"3",#"4",#"5",#"6",#"7",#"8",#"9"]
in
List.all (fn x => samelist s x) xs
end andalso rscheck (reverse xs);