gpt4 book ai didi

SML map 功能

转载 作者:行者123 更新时间:2023-12-04 15:56:10 27 4
gpt4 key购买 nike

我有这个功能:

map(map(fn x =>[x])) [[],[1],[2,3,4]];

产生:
val it = [[],[[1]],[[2],[3],[4]]]

我不明白这个功能是如何工作的。不是每个 map 函数都需要一个函数和一个列表吗?似乎没有足够的参数来实际执行。

如果我运行:
map(fn x =>[x]) [[],[1],[2,3,4]];

我得到:
val it = [[[]], [[1]], [[2,3,4]]];

这对我来说更有意义,因为它获取列表中的每个元素,并将其包装在另一个列表中。但是当我在上面放另一张 map 时,它会改变输出。任何人都可以向我解释这一点吗?谢谢!

最佳答案

你说:

I don't understand how this function works. Doesn't each map function need both a function and a list?



好吧,请记住,在标准 ML(以及一般所有应用语言)中,对于 1 以外的“n”,没有“n 个参数的函数”这样的东西。但是,多个函数可以通过两种方式模拟参数:
  • 作为元组或记录的单个参数的函数。通过从元组或记录中进行投影,可以在函数体中恢复原始预期参数。
  • 作为第一个参数的函数,返回一个函数的其余参数。

  • 考虑到这一点,我们检查 map在 REPL 中输入:
    > map;
    val it = fn: ('a -> 'b) -> 'a list -> 'b list

    (我使用 Poly/ML,而不是 SML/NJ,但撇开格式问题不谈,输出应该是一样的。)

    没有元组,没有记录。 map显然采用第二种方法来模拟具有两个参数的函数:它采用类型 'a -> 'b 的函数并返回另一个 'a list -> 'b list 类型的函数.

    现在,这里有一个问题:对于任何函数 foo , map foo也是一个函数!自 map可以将任何函数作为参数, map foo本身就是 map 的一个完全合理的论点.这意味着 map (map foo)任何函数的类型检查 foo .特别是,如果 val foo = fn x => [x] 是正确的.

    你说:

    It seems that there isn't enough arguments for this to actually execute.



    如果它类型检查,它运行。

    你说:

    If I run

    map (fn x => [x]) [[], [1], [2,3,4]]

    I get

    val it = [[[]], [[1]], [[2,3,4]]];

    Which makes more sense to me, as it takes each element in the list, and wraps it in another list. But when I put another map on it, it changes the output.



    让我们稍微重构一下您的代码,而不改变其含义:
    let
    val foo = fn x => [x]
    val bar = map foo
    val baz = map bar
    in
    baz [[], [1], [2,3,4]]
    end

    现在我们可以分析每个函数( foobarbaz )对其参数做了什么:
  • foo接受单个元素 x并将其包装在列表数据构造函数中。
  • bar获取一个元素列表,将每个元素包装在一个列表数据构造函数中,并返回一个包含结果包装元素的列表(一个列表列表)。
  • baz采用元素(子)列表的( super )列表,适用 bar到每个子列表,并返回一个包含结果的列表。

  • 手动执行所有这些操作以说服自己结果, [[], [[1]], [[2], [3], [4]]] ,确实是对的。

    关于SML map 功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20555881/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com