1

だから私はflatten fnを書いていて、これにたどり着きました:

fun flatten ls = List.foldr op @ [] ls

そして、変数に名前を付けるls必要がないことに気付きました。代わりに、おそらく部分的に適用するだけで済みますfoldr。しかし、これは壊れます:

val flatten = List.foldr op @ []

何がそれを台無しにしていますか?typfunは、宣言と部分的に適用された の両方で推測する必要があるようですfoldr

同様の sum 関数が機能しますが、なぜ@特に機能しないのか不思議に思います。

val sum = List.foldr op + 0

編集:私が得ているエラー:

- val flatten = List.foldr op @ [];

stdIn:1.6-2.13 Warning: type vars not generalized because of
   value restriction are instantiated to dummy types (X1,X2,...)
val flatten = fn : ?.X1 list list -> ?.X1 list

- flatten [[1], [1]];

stdIn:3.1-3.19 Error: operator and operand don't agree [literal]
  operator domain: ?.X1 list list
  operand:         int list list
  in expression:
    flatten ((1 :: nil) :: (1 :: nil) :: nil)
4

2 に答える 2