2

リストをインポートまたは出力する述語の pred を宣言するヘルプを探しています。私は試しました:- pred name(list::in, integer::out) はマルチです。また、list/0 が認識されないというコンパイラ エラー メッセージが表示されます。ライブラリモジュールのリストをチェックして、...(list(T)::in . . . ) のように書く必要があることを確認しましたが、何をすべきかを完全には理解していませんでした。

4

2 に答える 2

3

リストはパラメトリック型で、パラメトリック型は 1 つ以上のパラメーターを取ります。リストの場合、パラメーターはこれが何のリストであるかを示します。数値のリスト、文字列のリスト、カボチャのリスト、または数値のリストのリスト (有効なタイプ) を使用できます。したがって、次のような関数を作成すると:

:- func max(list(int)) = int.

この関数は int のリストを取り、int (リストにある最大数) を返します。

では、list(T) とは何ですか? 大文字で始まるトークンは、型であっても変数です。他の型を表すことができます (通常)。したがって、「list(T)」は、数値や文字列のリストなど、あらゆるもののリストを意味します。次の述語は多相的で、型変数の実際の値に応じてさまざまな型に対して機能します。

:- pred first(list(T)::in, T::out) is semidet.

リストの最初の項目があればそれが返されるので、何でもリストを渡すことができます。これが文字列のリスト "list(string)" で使用される場合、T は (コンパイル中に) "string" に置き換えられます。

Mercury の型システムのこの部分のリファレンスはこちらです。 http://www.mercurylang.org/information/doc-release/mercury_ref/Discriminated-unions.html#Discriminated-unions

于 2014-11-28T05:04:20.053 に答える
0

私は試しました:- pred name(...list(T),....) is ... で、コンパイラは pred 宣言に関連するエラーを報告しなくなりました。結果が正しいかどうかはまだわかりませんが、一歩近づいています。

于 2014-11-26T20:03:55.240 に答える