F#(F Sharp)解压缩功能说明

时间:2020-09-15 08:57:32

标签: functional-programming f# unzip

我正在使用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);;

1 个答案:

答案 0 :(得分:4)

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

这些可能很难带您上路,但是在函数式编程中很常见。

我认为大多数模式匹配都可以,并且您知道function关键字的缩写。

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

您似乎很满意:

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

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

下一位...

|    (x,y)::rest ->

获取列表的第一个元素(头部),并从尾部将其拆分。它还将作为元组的head元素解构为2个值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
相关问题