如何修改Standard ML的foldr函数,使其类型为('a * 'b -> 'b) -> 'a list -> 'b -> 'b?
修改Standard ML中foldr函数的类型签名
你作为Standard ML初学者,已知原foldr实现及类型签名如下:
fun foldr f [] a = a | foldr f (x::xs) a = f x (foldr f xs a) (* 原类型签名:('a -> 'b -> 'b) -> 'a list -> 'b -> 'b *)
要将其类型签名改为('a * 'b -> 'b) -> 'a list -> 'b -> 'b,核心是把原函数中接受柯里化参数的f,改为接受元组参数的f,仅需修改递归调用时传递给f的参数形式:
fun foldr f [] a = a | foldr f (x::xs) a = f (x, foldr f xs a)
改动说明:
- 原代码中
f x (foldr f xs a)是将x和递归结果作为两个独立参数传给柯里化的f; - 修改后
f (x, foldr f xs a)是把x和递归结果打包成一个元组(x, foldr f xs a),作为单个参数传给接受元组的f,这就匹配了目标类型签名里('a * 'b -> 'b)的函数参数要求。
内容的提问来源于stack exchange,提问作者lu123
相关产品推荐
相关产品推荐

