F# (F sharp) 解压缩功能解释
F# (F sharp) unzip function explained
我正在使用 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);;
首先,这是一个递归函数 - rec
关键字是赠品 :)。
这些可能很难让您理解,但在函数式编程中很常见。
我假设您对正在进行的大部分模式匹配没有问题,并且您知道 function
关键字 shorthand.
let rec unzip = function
| [] -> ([],[])
| (x,y)::rest ->
let (xs,ys) = unzip rest
(x::xs,y:ys);;
您似乎很满意:
| [] -> ([],[])
给定一个空列表,return 一个包含 2 个空列表的元组。这不仅仅是一个保护子句,稍后将用于永久停止递归程序运行。
下一位...
| (x,y)::rest ->
获取列表的第一个元素(头)并将其从尾部分离出来。它还将作为元组的头元素解构为 2 个值 x
和 y
.
可以长手写成:
| 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
我正在使用 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);;
首先,这是一个递归函数 - rec
关键字是赠品 :)。
这些可能很难让您理解,但在函数式编程中很常见。
我假设您对正在进行的大部分模式匹配没有问题,并且您知道 function
关键字 shorthand.
let rec unzip = function
| [] -> ([],[])
| (x,y)::rest ->
let (xs,ys) = unzip rest
(x::xs,y:ys);;
您似乎很满意:
| [] -> ([],[])
给定一个空列表,return 一个包含 2 个空列表的元组。这不仅仅是一个保护子句,稍后将用于永久停止递归程序运行。
下一位...
| (x,y)::rest ->
获取列表的第一个元素(头)并将其从尾部分离出来。它还将作为元组的头元素解构为 2 个值 x
和 y
.
可以长手写成:
| 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