2013-12-19 5 views
6
  • Являются ли в списках понятий просто языковой функцией?
  • Что является самым простым способом подделать понимание списка с использованием чистого Haskell?
  • Вам нужно использовать блок do/>>=, чтобы сделать это, или вы могли бы использовать какой-либо другой метод для взлома понимания списка вместе?

Разъяснение: Под «подделкой» список понимания я имею в виду создать функцию, которая принимает один и тот же вход и производит один и тот же вход, то есть форма для возвращаемых значений, перечислено хрустеть вместе, а предикат или несколько предикатов ,Как реализованы списки в Haskell?

+0

[This] (http: //www.haskell.or g/haskellwiki/List_comprehension) может ответить на некоторые из ваших вопросов. В нем объясняется, как понимаются синтаксический сахар для обозначения, которые сами по себе являются просто синтаксическим сахаром для '>> =', но я действительно не знаю, что вы подразумеваете под «подделкой понимания списка с использованием чистого Haskell». Это _is_ чистый Haskell, согласно спецификации Haskell. – bheklilr

+1

Я добавил разъяснение, но я действительно не понимаю, почему это так много голосов, я просто спрашиваю, как можно было бы составить понимание списка без использования понимания списка, чтобы лучше понять их. – reem

+6

Я думаю, что это законный вопрос. И я его поддержал. – augustss

ответ

19

Section 3.11 в отчете Haskell описывает, что именно означает понимание списка и как их перевести.

Если вы хотите монады постижений вы в основном должны заменить [e] на return e, [] по mzero и concatMap по (>>=) в переводе.

10

Чтобы увеличить ответ augustss «s, если у вас есть что-то вроде:

[(x, y) | x <- [1..3], y <- [1..3], x + y == 4] 

... это эквивалентно использованию этого do обозначения:

do x <- [1..3] 
    y <- [1..3] 
    guard (x + y == 4) 
    return (x, y) 

... что эквивалентно для этого использования concatMap:

concatMap (\x -> 
    concatMap (\y -> 
     if (x + y == 4) then [(x, y)] else [] 
     ) [1..3] 
    ) [1..3] 
Смежные вопросы