我想制作一个自定义地图函数,它与sml中的预定义地图函数做同样的事情,我编写了以下代码:
fun mymap f = fn L => foldr f [] L;
哪个基本上是函数f,然后可以获取列表并将函数f应用于列表,因为map函数接受列表和函数并返回另一个列表,现在我得到的是:
val mymap = fn : ('a * 'b list -> 'b list) -> 'a list -> 'b list
但预定义的地图功能具有以下输出:
val it = fn : ('a -> 'b) -> 'a list -> 'b list
我在这里遇到的问题是什么? 感谢
注意:我必须使用foldr或foldl功能并使用currying
答案 0 :(得分:1)
有什么问题?好吧,正如您所看到的,问题是您的函数的第一个参数(f
)具有错误的类型,可用作foldr
的第一个参数。您必须首先了解需要哪种函数作为foldr
的第一个参数。
答案 1 :(得分:1)
嗯,你必须明白,对于你应用foldr的列表中的每个元素,它需要该列表的一个元素,前一个结果(或起始值)并且给两个函数都是第一个参数折叠。
这意味着,在你编写的代码中,f有两个参数。所以f取一个列表的值('a
)和一个列表('b list
),这给了我们类型:
'a * 'b list -> 'b list
但是在map函数中,你希望将f应用于每个列表元素,因此你需要将foldr的第一个参数作为抽象,将f应用于列表元素,并将结果添加到输出列表。