7

最初の文字が大文字である文字列のリストをフィルタリングする次のコードがあります。

fun f s = Char.isUpper(String.sub(s,0));
fun only_capitals (xs : string list) =  List.filter(f , xs);

しかし、コンパイルすると、常にエラーが発生します:

operator domain: 'Z -> bool
operand:         (string -> bool) * string list
  in expression:
    List.filter (f,xs)

このエラーはどういう意味ですか? 修正方法は?

4

5 に答える 5

15

List.filterisの型シグネチャ

val filter : ('a -> bool) -> 'a list -> 'a list

したがって、たまたま tuple である 1 つの引数ではなくList.filter、2 つの異なる引数を指定する必要があります。

于 2013-02-06T10:23:01.593 に答える
5

次のように変更する必要があります。

fun only_capitals (xs : string list) =  List.filter f xs

filterf関数( 'a -> bool) とリストの 2 つの引数を取ります。

ML でタプルを渡す構文と、他の言語での関数型アプリケーションの構文を混同しがちです。

次のように定義することもできます。

val only_capitals = List.filter f
于 2013-02-06T10:23:09.360 に答える
4

ML の関数は引数を1 つだけ取ることができます。説明はこちらから(メモとビデオも参照)。

List.filterはいわゆるカリー化された関数なので、List.filter f xs実際(List.filter f) xsList.filter fは は関数です。tuple ではなくf (fn: a -> bool)、 への引数として提供する必要があります。List.filter(f, xs)

簡単な例を次に示します。呼び出すと、その環境でis_sorted 1クロージャが取得されます。xこのクロージャを 2 で呼び出すと、 が得trueられ1 <= 2ます。

val is_sorted = fn x => (fn y => x <= y)
val test0 = (is_sorted 1) 2

val is_sorted = fn : int -> int -> bool
val test0 = true : bool
于 2013-10-30T11:49:15.937 に答える
2

SML ドキュメントでは、次のように述べています。

filter fl は、l の各要素 x に左から右に f を適用し、fx が true と評価された x のリストを、引数リストで発生したのと同じ順序で返します。

したがって、それはカリー化された関数です。

于 2014-10-24T19:30:02.997 に答える