输出从1到8的所有实例,其中一个数字的拼写长度大于一个值的拼写长度?

Output all instances from 1 to 8 where the length of the spelling of a number is greater than the length of the spelling of a value higher than it?

我是一个彻头彻尾的 Haskell 新手,现在我已经尝试了整整一天。

所以一个输出可能是:

三、六

(3小于6但拼写比6长)

我在 Haskell 中想到了这个,但是变量超出了范围,我还没有真正理解 Haskell 中的范围。这可能是完全错误的,但我们将不胜感激。

let numbers = [("One",1),("Two",2),("Three",3),("Four",4),("Five",5),("Six",6),("Seven",7),("Eight",8)]

[([ x | x <- numbers], [y | y <- numbers]) | length (fst x) > length (fst y), snd x < snd y]

有人可以帮我纠正这个嵌套列表理解吗?或者甚至告诉我是否可以使用嵌套列表理解?

澄清:

我想输出一个对列表,其中对中第一个元素的拼写比对中第二个元素的拼写长,而且对中第一个元素是数字,作为数字小于对中的第二个元素。

听起来你想要这样的东西:

[(y1, y2) | (x1, y1) <- numbers, (x2, y2) <- numbers, length x1 > length x2, y1 < y2]

也就是说,它是一个数字对列表 - 具有您指定的要求。我暂时无法对此进行测试,我认为它应该可以工作,但如果您有任何问题,请告诉我。

您的范围问题是因为您试图进行嵌套推导并从外部推导中的内部推导访问变量 - 这是不允许的,因为推导内部使用的变量仅在该特定推导的范围内。

我还通过对元素对的显式模式匹配替换了您对 fstsnd 的使用,这几乎总是首选,因为它更显式。