簡體   English   中英

Haskell:FRP 反應性 Parsec?

[英]Haskell: FRP Reactive Parsec?

Haskell 中是否有(或可能有)反應式Parsec (或任何其他純功能解析器)?

簡而言之,我想逐個字符地為解析器提供數據,並獲得足夠多的結果以獲取 output。

或者更簡單,我怎樣才能在foldr或至少map中做到這一點?

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

編輯

我的問題特別是關於 FRP。 我以解析器為例,這是我能想到的最好的方法來澄清我的問題並全面了解我的需求。

我相信 FRP 不僅僅是關於 UI,對吧?

您不能在 Parsec 中進行在線解析,它必須消耗所有輸入才能確定是否存在有效解析。

然而,還有其他選擇。 一種可能是使用Utrecht 解析器組合器,它具有在線解析功能。

我不認為把這個叫做“FRP”是正確的,這種東西的正確名稱是online algorithm ,這意味着解析器一收到輸入就會產生 output 。 (與離線算法相反,解析器預先接收整個輸入並從中生成 output。)

在 Haskell 中,惰性求值使得編寫在線算法變得容易。 Malcom Wallace 開發了一組特殊的解析器組合器,用於使用惰性求值的在線解析。

您可以在 Parsec 中進行在線解析,但要做到這一點,您需要將它放在類似 iteratee 的東西之上。

Parsec 3 is capable of working with arbitrary Stream types, so you can make an instance of Stream which views the current 'stream' as a position, and uses an iteratee to retrieve the value at that position.

一個這樣的例子是iteratee-parsec package

通過解析關於 iteratees 和 parsec 的 trifecta talk提供了另一種方法(警告 PDF):

一種折衷方案是構建一個類似迭代器的類型,它緩沖最后幾個塊片段而不是所有塊片段,以使其能夠保持有限的空間利用率,並依賴迭代器機制進行回溯。 這是我目前使用的,但我沒有任何在線代碼。

一旦你通過在 Iteratee 上運行 Parsec 來反轉控制,就很容易一次輸入一個字符,看看它是否已經設法識別任何東西。

看看 attoparsec-conduit,使用正確的解析器,它可能是將 stream 字節轉換為 stream 解析數據結構的有用方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM