, который именно то, что вы хотели.

ли способ использоватьlet,where или иным образом определить подвыражения в понимании списка, чтобы его можно было использовать как в терминах, так и в ограничениях?

Из моих экспериментов следующие работы:

[let x = i*i in x | i<-[1..10], i*i > 20]   --good
[i*i | i<-[1..10], let x=i*i in x > 20]     --good

Но это не bc of scope:

[let x = i*i in x | i<-[1..10], x > 20]  -- 'x' not in scope error
let x = i*i in [x | i<-[1..10], x > 20]  -- 'i' not in scope error
[x | i<-[1..10], x > 20] where x = i*i   --parse error on 'where'

Такlet работает в одном месте или в другом, но не вместе!

Единственный способ заставить его работать (то есть избежать повторяющихся выражений и, возможно, вычислений) - это добавить глупый одноэлементный список, как я сделал здесь сx<-[cat i [1..k] как ограничение для понимания списка:

> let cat x l = foldl1 (++) $ map show [x*i | i<-l]
maximum [x| i<-[1..9999], k<-[2..div 10 $ length $ show i], x<-[cat i [1..k]], sort x == "123456789"]
"932718654"

Или, продолжая тривиальный пример выше,

[x | i<-[0..10], x<-[i*i], x > 20] --works

Это кажется немного глупым и немного неясным, хотя и не слишком неэффективным. Тем не менее, было бы хорошо, еслиlet или жеwhere работал через все понимание. Можно ли это сделать?

Ответы на вопрос(2)

Ваш ответ на вопрос