所以我正在写一个flatten fn,我做到了:
fun flatten ls = List.foldr op @ [] ls
而且我意识到命名变量ls
应该是不必要的,相反我可能只是部分地 apply foldr
。但这打破了:
val flatten = List.foldr op @ []
是什么让它一团糟?我似乎必须fun
为声明和部分应用推断类型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)