2011-07-13 36 views
10

Haskell中是否存在(或有可能)具有反應性的Parsec(或任何其他純函數解析器)?Haskell:FRP Reactive Parsec?

簡而言之,我想通過char自己提供解析器char,並獲得足夠多的結果以獲得輸出。

還是簡單得多,我該如何做到foldr或者至少map

我們是否需要不同的版本來支持這種反應行爲?

編輯

我的問題是關於特別是FRP。我使用了一個解析器作爲例子,這是我能想到的最好的解決方案,以澄清我的問題並給出我需要的大圖。

我相信FRP不僅僅是UI,對嗎?

+5

Attoparsec支持增量分析,如果這就是你想要什麼? – Masse

回答

8

你不能在Parsec中進行在線分析,它必須消耗所有輸入以確定是否存在有效的分析。

但是還有其他選擇。 有一種可能性是使用Utrecht parser combinators,它具有在線解析功能。

8

我不認爲這是正確的稱之爲「玻璃鋼」,對於這種事情的正確的名稱是online algorithm,這意味着解析器只要它接收的輸入產生輸出。 (而不是脫機算法,其中解析器接收整個輸入前端並從中產生輸出。)

在Haskell中,懶惰評估使得編寫在線算法變得容易。 Malcom Wallace開發了一套用於在線解析的解析器組合器,使用懶惰評估。

6

你可以在Parsec中進行在線分析,但是爲了做到這一點,你需要將它分層疊加在iteratee之類的東西上。

Parsec 3能夠處理任意Stream類型,因此您可以創建一個Stream實例,它將當前「流」視爲位置,並使用迭代器檢索該位置的值。

其中一個例子是iteratee-parsec package

另一種方法是通過parsing trifecta talk on iteratees and parsec(警告PDF)提供

折衷的辦法是建立一個iteratee樣類型的緩衝過去幾大塊碎片,而不是所有的人,以使其能夠保留有限的空間利用率,並依靠迭代機制進行回溯。這是我目前使用的,但我沒有任何代碼在線。

一旦你通過在Iteratee上運行秒差距反相控制,這是很容易給它輸入一個字符一次,看看它是否已經成功還沒有認識到任何東西。

+0

@ KA100你應該接受這個答案。 –

1

看一看attoparsec-導管,用正確的語法分析器它可以是一個字節流轉換爲解析的數據結構

流的有效途徑