1

次の関数は、空のリストを照合しようとした時点でコンパイルエラーを出します。

let rec tuplesToList (acc: int list) (remaining: int*int list) =
    match remaining with
    | [] -> acc
    | (a, b) :: tail -> tuplesToList (a :: b :: acc)

エラーは次のとおりです。

This expression was expected to have type int * int list but here has type 'a list

これは、がタプルではなくsのremaining単純なリストである場合に正常に機能します。intタプルの空のリストを一致させるにはどうすればよいですか?

4

2 に答える 2

5

[]タプルの空のリストに一致させるのは問題ありません。ただし、型アノテーションによると、remainingはタプルのリストではなく、intとintリストを含むタプルです。タプルのリストはになります(int*int) list。ではなく、int * int listとして解析されます。int * (int list)(int * int) list

タイプを修正すると、コードは正常に機能するはずです。

于 2013-02-06T15:10:49.157 に答える
2

tailsepp2kの観察に加えて、再帰呼び出しの2番目のパラメーター()も忘れてしまいました。また、コードはタイプアノテーションがまったくなくても正常に機能します。

let rec tuplesToList acc remaining =
  match remaining with
  | [] -> List.rev acc //reverse to preserve original order
  | (a, b) :: tail -> tuplesToList (a :: b :: acc) tail
于 2013-02-06T15:17:27.473 に答える