Haskell惰性求值疑问:interact+head.words是否读取全部输入?
你的Haskell程序只会读取第一个单词
先直接给结论:这个程序不会读取全部输入,它只会读取到输入中的第一个单词(准确说,是第一个非空白序列的结束位置),之后的输入根本不会被处理。
为什么会这样?核心原因就是Haskell的惰性求值特性,我们一步步拆解来看:
先看
interact的作用:它接收一个String -> String的函数,然后从标准输入读取字符串,传给这个函数,再把函数的输出打印到标准输出。但因为惰性求值,它不会一次性把所有输入都读进来,而是按需读取。再看你传给
interact的函数:head . words,这是words和head的组合。words函数的作用是把字符串按空白字符(空格、换行、制表符等)分割成单词列表,但它是惰性生成这个列表的——也就是说,它不会提前把整个输入都拆成所有单词,而是当需要列表的下一个元素时,才会继续处理输入。head函数只需要列表的第一个元素,当它拿到这个元素后,就不会再要求words生成后续的元素了。
举个实际的例子:如果你的输入是"Apple Banana Cherry\nMore Words",程序只会读取到Apple之后的第一个空格,后面的Banana Cherry以及换行后的内容都不会被读取——因为head已经得到了它需要的第一个单词,整个计算流程就停止了,不需要再处理剩下的输入。
不过要注意:如果输入全是空白字符(没有任何单词),那head会抛出Prelude.head: empty list的错误,但这属于边界情况,不影响我们对"读取量"的结论。
内容的提问来源于stack exchange,提问作者dmg
相关产品推荐
相关产品推荐

