[英]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.