【问题标题】:F# (F sharp) unzip function explainedF#(F sharp)解压函数解释
【发布时间】:2021-01-02 00:13:06
【问题描述】:

我正在学习使用 F# 的函数式编程的大学课程,但我一直对以下程序的逻辑流程感到困惑。有人愿意解释一下吗?

let rec unzip = function
    |    []          ->  ([],[])
    |    (x,y)::rest ->
               let (xs,ys) = unzip rest
               (x::xs,y:ys);;

所以这个程序应该获取一个对的列表,并输出一对列表。

[(1,'a');(2,'b')] -> ([1;2],['a','b'])

在我看来,就像参数(列表)为空的基本情况一样,给出了输出的格式,但我不明白第三行和第四行是如何评估的。

let (xs,ys) = unzip rest
(x::xs,y:ys);;

【问题讨论】:

    标签: functional-programming f# unzip


    【解决方案1】:

    首先,这是一个递归函数 - rec 关键字是赠品:)。

    这些可能很难让您了解,但在函数式编程中很常见。

    我假设您对大部分模式匹配都没有问题,并且您知道function 关键字简写。

    let rec unzip = function
        |    []          ->  ([],[])
        |    (x,y)::rest ->
                   let (xs,ys) = unzip rest
                   (x::xs,y:ys);;
    

    你似乎很满意:

    |    []          ->  ([],[])
    

    给定一个空列表,返回一个包含 2 个空列表的元组。这不仅仅是一个保护子句,它稍后将用于停止递归程序永远运行。

    接下来...

    |    (x,y)::rest ->
    

    获取列表的第一个元素(头部)并将其与尾部分开。它还将作为元组的头元素解构为两个值xy

    可以写成:

    |    head::rest ->
              let x,y = head
    

    现在是它自称的有趣部分:

    let (xs,ys) = unzip rest
    (x::xs,y:ys);;
    

    通过一个示例了解每个步骤发生的情况可能会有所帮助:

    unzip [(1,'a');(2,'b');(3,'c')]
     x = 1
     y = 'a'
     rest = [(2,'b'); (3,'c')]
     unzip rest
      x = 2
      y = 'b'
      rest = [(3,'c')]
      unzip rest
       x = 3
       y = 'c'
       rest = []
       unzip rest
         return [],[]
       xs = []
       ys = []
       return [x:xs],[y:ys]     # 3:[] = [3], 'c':[] = ['c']
      xs = [3]
      ys = ['b']
      return [x:xs],[y:ys]      # 2:[3] = [2,3], 'b':['c'] = ['b', 'c']
     xs = [2,3]
     ys = ['b','c']
     return [x:xs],[y:ys]       # 1:[2;3] = [1,2,3], ['a']:['b';'c'] = ['a', 'b', 'c']
    done
    

    【讨论】:

    • 谢谢,戴夫!感谢您非常详尽的回答!这个例子非常清楚!我现在看到“let (xs;ys)”是一个绑定语句,下一部分连接到该列表中。
    • 干杯。是的,它将使用rest 调用自身的结果分配给xsys,但这只发生在它最终到达列表末尾并返回([],[]) 而不是递归时;然后它开始倒转。我经常不得不写出这样的递归函数,尤其是在学习haskell时:)
    猜你喜欢
    • 2010-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 2015-06-03
    • 1970-01-01
    相关资源
    最近更新 更多