だから私は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)