のタイプに注釈を付ける際に遭遇した問題は、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
ただし、通常は、通常の楽しいマッチングにマッチングを含めることができます。