首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何扩展haskell表达式?

如何扩展haskell表达式?
EN

Stack Overflow用户
提问于 2022-09-19 16:24:31
回答 1查看 142关注 0票数 0

如何扩展

代码语言:javascript
复制
concat( map (interleave 2) [[3,4][4,3]])

interleave::a->[a]->[[a]]
interleave x []=[[x]]
interleave x (y:ys)=(x:y:ys):map (y:) (interleave x ys)

我用了ghci翻译,得到了以下答案:

代码语言:javascript
复制
[[2,3,4],[4,2,3],[3,4,2],[2,4,3],[3,2,4],[4,3,2]]

我运行以下代码:

代码语言:javascript
复制
map (interleave 2) [[3,4][4,3]]

得到了输出:

代码语言:javascript
复制
[[[2,3,4],[4,2,3],[3,4,2]],[[2,4,3],[3,2,4],[4,3,2]]]

当我做模拟跑步时,我做了以下操作:

代码语言:javascript
复制
concat( map (interleave 2) [[3,4][4,3]])
=>
concat( interleave 2 [3,4], interleave 2 [4,3])
=>
concat([[2,3,4],[4,2,3],[3,4,2]],[[2,4,3],[3,2,4],[4,3,2]])
=>
[2,3,4,4,2,3,3,4,2,2,4,3,3,4,2,4,3,2]

有人能解释一下这个表达式是如何计算的吗?

EN

回答 1

Stack Overflow用户

发布于 2022-09-19 16:43:47

括号让人困惑。map (interleave 2) [[3,4], [4,3]]将生成一个列表。的确:

代码语言:javascript
复制
   map (interleave 2) [[3,4][4,3]]
-> [interleave 2 [3, 4], interleave 2 [4, 3]]

现在,交织将生成一个列表列表,其中它在任何可能的插入点插入项目,因此:

代码语言:javascript
复制
   [interleave 2 [3, 4], interleave 2 [4, 3]]
-> [[[2, 3, 4], [3, 2, 4], [3, 4, 2]], [[2, 4, 3], [4, 2, 3], [4, 2, 3]]]

因此,这是整数列表的列表。现在我们将这些连接起来,这意味着将外部列表的两个元素连接起来,因此:

代码语言:javascript
复制
   concat [[[2, 3, 4], [3, 2, 4], [3, 4, 2]], [[2, 4, 3], [4, 2, 3], [4, 2, 3]]]
-> [[2, 3, 4], [3, 2, 4], [3, 4, 2], [2, 4, 3], [4, 2, 3], [4, 2, 3]]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73776497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档