2011-07-13 31 views
10

Có (hoặc có thể có) một phản ứng Parsec (hoặc bất kỳ trình phân tích cú pháp chức năng thuần túy nào khác) trong Haskell không?Haskell: FRP Reactive Parsec?

Đơn giản chỉ cần đặt, tôi muốn phân tích cú pháp bản thân mình char của char và nhận được kết quả nhiều như tôi đủ ăn để có được kết quả đầu ra.

Hoặc đơn giản hơn nhiều, tôi có thể làm như thế nào trong foldr hoặc ít nhất map?

Chúng ta có cần phiên bản khác của chúng để hỗ trợ hành vi phản ứng đó không?

EDIT

Câu hỏi của tôi là về FRP nói riêng. Tôi đã sử dụng một trình phân tích cú pháp làm ví dụ, đó là điều tốt nhất tôi có thể nghĩ đến để làm rõ câu hỏi của mình và đưa ra bức tranh lớn về những gì tôi cần.

Tôi tin FRP không chỉ là về giao diện người dùng, đúng không?

+5

Attoparsec hỗ trợ phân tích gia tăng nếu đó là những gì bạn muốn? – Masse

Trả lời

8

Bạn không thể thực hiện phân tích cú pháp trực tuyến trong Parsec, nó phải tiêu thụ tất cả đầu vào để xác định xem có phân tích cú pháp hợp lệ hay không.

Tuy nhiên, có các lựa chọn thay thế. Một khả năng là sử dụng Utrecht parser combinators, nó có phân tích trực tuyến trong số các tính năng của nó.

8

Tôi không nghĩ rằng đó là quyền gọi đây là "FRP", tên phù hợp với loại điều là online algorithm, có nghĩa là phân tích cú pháp sản xuất ra ngay sau khi nó nhận được đầu vào. (Trái ngược với thuật toán ngoại tuyến, trong đó trình phân tích cú pháp nhận toàn bộ đầu vào đầu vào và tạo ra kết quả đầu ra từ đó.)

Trong Haskell, đánh giá lười biếng giúp dễ dàng viết các thuật toán trực tuyến. Malcom Wallace đã phát triển một bộ các trình kết hợp phân tích cú pháp đặc biệt để phân tích cú pháp trực tuyến sử dụng đánh giá lười biếng.

6

Bạn có thể thực hiện phân tích cú pháp trực tuyến trong Parsec, nhưng để làm như vậy, bạn cần xếp lớp nó lên trên một thứ giống như một iteratee.

Parsec 3 có khả năng làm việc với các loại luồng tùy ý, vì vậy bạn có thể tạo một trường hợp luồng xem luồng 'hiện tại' làm vị trí và sử dụng một iteratee để truy lục giá trị tại vị trí đó.

Một ví dụ như vậy là iteratee-parsec package.

cách tiếp cận khác được cung cấp bởi parsing trifecta talk on iteratees and parsec (cảnh báo PDF):

Một thỏa hiệp là xây dựng một loại iteratee-như thế đệm vài mảnh đoạn cuối cùng chứ không phải tất cả trong số họ để kích hoạt nó để duy trì việc sử dụng không gian giới hạn, và dựa vào máy móc iteratee để quay ngược lại. Đây là những gì tôi hiện đang sử dụng, nhưng tôi không có bất kỳ mã trực tuyến cho nó.

Khi bạn đã đảo ngược kiểm soát bằng cách chạy Parsec trên đầu trang của một Iteratee, nó là khá dễ dàng để nuôi nó đầu vào một nhân vật tại một thời điểm và xem nếu nó đã quản lý để nhận ra bất cứ điều gì được nêu ra.

+0

@ KA100 bạn nên chấp nhận câu trả lời này. –

1

Có một cái nhìn tại attoparsec-ống dẫn, với sự phân tích cú pháp đúng nó có thể là một cách hữu ích để dịch một dòng byte vào một dòng của cấu trúc dữ liệu phân tích cú pháp

Các vấn đề liên quan