1

誰かがここで私を案内してくれたら幸いです。私が間違っていたこととその理由を本当に理解したいですか?

これは私のコードです:

fun get_longest xs = foldl((fn (x ,y ) => if  String.size x >= String.size y then x
else y),[],xs)

私の関数は文字列のリストを取り、最も長い文字列を返す必要があります。リストが空の場合は、return [].

しかし、私はこのエラーが発生しています:

Error: operator and operand don't agree [tycon mismatch]
  operator domain: 'Z * 'Y -> 'Y
  operand:         (string * string -> string) * int * 'X
  in expression:
  foldl ((fn (<pat>,<pat>) => if <exp> then <exp> else <exp>),0,xs)

uncaught exception Error
  raised at: ../compiler/TopLevel/interact/evalloop.sml:66.19-66.27
             ../compiler/TopLevel/interact/evalloop.sml:44.55
             ../compiler/TopLevel/interact/evalloop.sml:296.17-296.20
4

2 に答える 2

6

foldlの署名を見てください:

val foldl : ('a * 'b -> 'b) -> 'b -> 'a list -> 'b

関数がフォームを持つ必要があることがわかります

fun get_longest xs = foldl foo acc xs 

ここfooで、 は要素とアキュムレータに適用される関数で、accは初期アキュムレータです。

ヒント:

  1. get_longestを返すため、stringアキュムレータの型は である必要がありstringます。あなたの仕事は、入力する適切な文字列を見つけることです。[]ここで必要な値は意味をなさないことに注意してください。
  2. xsであるstring list場合、foo関数には type が必要string * string -> stringです。fooここで、適切な無名関数に置き換える必要があります。
于 2013-02-05T21:57:05.297 に答える
4

foldlはカリー化された関数で、型は('a * 'b -> 'b) -> 'b -> 'a list -> 'b. したがって、 として呼び出す必要がありますfoldl f s xs。と呼んでいfoldl (f, s, xs)ます。foldlタプルを引数として呼び出し、タプルをfoldl想定していないため、これは間違っています。その場合、そのタイプは になります('a * 'b -> 'b) * 'b * 'a list -> 'b

于 2013-02-05T21:55:52.940 に答える