Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
331 views
in Technique[技术] by (71.8m points)

list - I am struggling to understand how concat is read in Haskell

The code for concat:

concat :: [[a]] -> [a]
concat xss = [x | xs <- xss, x <- xs]

I don't understand how it is being read. How does xss get split into xs and x? Or am I misreading it?

For example, given:

concat [[1,2,3],[4],[5]]

how is [1,2,3,4,5] achieved?

question from:https://stackoverflow.com/questions/66066788/i-am-struggling-to-understand-how-concat-is-read-in-haskell

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Inside a list comprehension, the bit a <- b means "for each a in b".

So in your case, xs <- xss should read like "for each xs in xss", and then x <- xs should read like "for each x in xs", which is also valid becase xs itself is a list, because xss is a list of lists.

So as the list comprehension unfolds, xs becomes bound first to [1,2,3], then to [4], and then to [5], and within each iteration of xs, x becomes bound to 1, 2, 3, then to 4, and finally to 5.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...