あなたの質問は一種の混乱です - あなたは機能が欲しいですリスト内のすべての値を返します。可変数の値を返す最も簡単な方法は、リストを使うことです!あなたはおそらくPythonジェネレータをエミュレートしようとしていますか? OCamlにはyield
と似たものはありませんが、代わりに通常は(iter
、fold
またはmap
を使用して)値に関数を渡すことで同じ結果が得られます。あなたがこれを行うにしようとしている場合
def elements(list):
if(len(list) == 0):
return []
else:
list[0]
return elements(list[1:])
:
:OCamlの中で
def elements(list):
if(len(list) > 0):
yield list[0]
# this part is pretty silly but elements returns a generator
for e in elements(list[1:]):
yield e
for x in elements([1,2,3,4,5]):
dosomething(x)
同等のものを、次のようになりますあなたが現在書かれているPythonでこれに相当します
List.iter dosomething [1;2;3;4;5]
リストaがリストbのサブセットであるかどうかを判断しようとしている場合(あなたのコメント)、その後はList.mem
とList.for_all
を活用することができる。
List.for_all (fun x -> List.mem x b) a
fun x -> List.mem x b
は、値x)はBのメンバーである(任意の要素と同じである場合に真を返す関数を定義します。 List.for_all
はbool(ここでは今定義したメンバーシップ関数)とリストを返す関数を取ります。この関数はリストの各要素に適用されます。この関数がリストのすべての値に対してtrueを返す場合、for_all
はtrueを返します。
私たちがしたことは:aのすべての要素について、それらがbのメンバーであるかどうかを確認します。これらの関数を自分自身で書く方法に興味があるなら、list.mlのソースを読むことをお勧めします。これはおそらく/ usr/local/lib/ocamlまたは/ usr/lib/ocamlにあります。
ありがとうございます。私はあなたが説明したように、2つのステップで2つのステップでこれを行うことを考えていますが、私の問題は、各要素を1つずつ取り出すことです。私は少し具体的にすべきだ。私の主な機能は、リストaがリストbのサブセットであるかどうかを判断するタスクが与えられているサブセット関数です。私はこの関数を多態的な形で書く必要がありますが、今はintのリストでそれを行う方法しか分かりません。 – Atticus
問題は、リストの最初の要素を返す関数を作成したためです:let head list = list with h :: t - > h | [] - > 0。空のリストを考慮する必要があるので、私は0を返し、OCamlはこの関数がintのリストを取ると判断します。サブセット関数は多態的でなければならないので、空のセットに対して何を返すべきかを事前に知ることはできません。0、 "null"などです。したがって、これはintのリストに制限されます。この場合、 – Atticus
(空リストの返り方)は、単にエラーを発生させます:(failwith "error") – gasche