0

ML でリストをマッピングすることについて質問があります。問題が繰り返されるようです。現在のデータ型が定義されています。

datatype 'a seq = Nil | Cons of 'a * (unit -> 'a seq);
datatype 'a generic_list = List of 'a list
                          |Seq of 'a seq;

私は今、「'a generic_list」を受け取り、「int generic_list:

val rec generic_map = fn (f,List(lst)) => if lst=nil then List([])                                             
      else List(f(List.hd(lst))::generic_map(f,List( List.drop(lst,1))));

そのコードは次のエラーでコンパイルされません: 句の右側が関数の結果の型と一致しません [tycon mismatch] 式:

'Z generic_list
 result type:  'Z list
 in declaration:
   generic_map =
     (fn (f,List lst) =>
           if lst = nil
           then List nil
           else List
                  (f (List.hd lst) ::
                     generic_map (f,List (List.drop (lst,1)))))

ここで何が問題なのか、それを修正してコンパイルできるようにする方法を知りたいのですが、間違いを見つけることができません

4

1 に答える 1

2

'else' 部分では、 を実行します。これは、ではなくを返さなければならないsomething :: generic_map (...)ことを意味します。generic_maplistgeneric_list

また、あなたがケースをどこで扱っているのかまったくわかりませんseq

if一般的な注意事項として、 、List.hdおよびフレンズの代わりにパターン マッチングを使用することを強くお勧めします。特に、次のような比較lst = nilは常に間違っています。これは、リストを等値型の要素に制限するためです。パターン マッチングを使用するか、少なくともList.null述語を使用してください。

于 2013-06-14T15:12:21.907 に答える