私の質問はここのようなものです。
私はcharリストリストに取り組んでおり、1〜9がすべてのリストで1回使用されていることを確認する必要がありますが、リスト内のすべての位置でも1回使用されていることを確認する必要があります。
私のコードは次のようになります。
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);