5

タプルリストを引数として関数を作成しようとしましたが、「未解決のフレックスレコード (このコンテキストのすべてのフィールドの名前を知る必要があります)」というエラーが表示され続けます。私のコードは次のとおりです。

fun convert d = ( (map (#1) d) , (map (#2) d) );

これは基本的に、ペアのリストをリストのペアに変換しようとしています。 dasの型も宣言しようとし:('a * 'b) listましたが、さらに多くのエラーが発生しました。これはタプルの不明なサイズと関係があると思われ、それを知らせる方法についていくつかの助けを借りることができます。

4

1 に答える 1

5

のタイプに注釈を付ける際に遭遇した問題は、d実際には注釈を親で囲んでいないことだけだったと思います。これは私にとってはうまくいきます。

fun convert (d : ('a * 'b) list) = ( (map (#1) d) , (map (#2) d) )

ただし、これは優れたSMLスタイルではありません。#1、などを使用すると#2#nこのような問題が発生するため、ややお勧めできません。このような問題では、型推論によって得られる通常の簡潔さが失われます。

代わりに、ペアに対していくつかの明示的な選択関数を定義できます。

fun first  (a, _) = a
fun second (_, b) = b

fun convert d = (map first d, map second d)

(関数適用はタプル構築よりも優先順位が高いため、本体から余分な括弧もconvert削除しました。また、命令型コードをシーケンスするとき、またはコードを入力するときにのみ本当に必要なセミコロンも削除しました。 REPL)

これは、ハーバード(またはタフツ)のコースからの、StandardMLのかなり良いスタイルガイドです。そのドキュメントの古いバージョンでは、特に「避けるべき一般的な間違い」でこれについて言及しています。

#1と#2を避けてください

一部の初心者は、ペアの2番目の要素を取得するための良い方法pはを書くことであるという考えを理解します#2 p

このスタイルは慣用的でも読みやすいものでもなく、タイプチェッカーを混乱させる可能性があります。ペアを処理する適切な方法は、パターンマッチングによるものです。

fun first (x, _) = x
fun second (_, y) = y

優先されますが、

fun bogus_first p = #1 p (* WRONG *)
fun bogus_second p = #2 p

(私が議論したくない理由のために、これらのバージョンはタイプチェックさえしません。)

ペアまたはタプルが関数の引数でない場合は、を使用valしてパターンマッチングを実行します。

val (x, y) = lookup_pair mumble

ただし、通常は、通常の楽しいマッチングにマッチングを含めることができます。

于 2013-01-02T22:07:33.633 に答える