2013-12-19 62 views
6
  • 列表解析只是一種語言功能嗎?
  • 什麼是使用純Haskell僞造列表理解的最簡單方法?
  • 您是否必須使用do塊/ >>=來做到這一點,或者您可以使用其他一些 方法來一起竊取列表理解嗎?

澄清:所謂「假」列表理解我的意思是創建一個函數,採用相同的輸入,併產生相同的輸入,即對返回值的形式,列出了緊縮在一起,斷言或多個謂詞。如何在Haskell中實現列表解析?

+0

[This](http://www.haskell.or g/haskellwiki/List_comprehension)可能會回答你的一些問題。它解釋了理解是如何用語法表示的,它們本身就是'>> ='的語法糖,但我真的不知道「假使用純Haskell的列表理解」是什麼意思。根據Haskell規範,它是純粹的Haskell。 – bheklilr

+1

我添加了一個說明,但我真的不明白爲什麼會得到這麼多的反對票,我只是問如何在不使用列表理解的情況下編寫列表理解來更好地理解它們。 – reem

+6

我認爲這是一個合法的問題。我贊成它。 – augustss

回答

19

Section 3.11在Haskell報告中準確描述了列表理解的含義,以及如何將它們轉換。

如果你想單子推導你基本上需要由return e[]通過mzero,並通過concatMap(>>=)翻譯替換[e]

10

爲了增強augustss的回答,如果你有這樣的:

[(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]