2013-03-09 39 views
8

Tôi đang cố gắng để có được một xử lý về những điều cơ bản của Haskell bằng cách tạo ra một tìm kiếm tập tin kiểu tìm kiếm kiểu Asational Velocity trên dòng lệnh. Thay vì giải quyết toàn bộ vấn đề, tôi đang thử một phiên bản rất cơ bản của nó: Có một tệp có 10 dòng và 3 chữ cái trên mỗi dòng. Sau mỗi chữ cái tôi nhập, tôi muốn cập nhật hiển thị danh sách các số dòng có thể chứa từ tôi đang nhập, dựa trên dữ liệu nhập của tôi cho đến thời điểm này.Thành ngữ Haskell nào tôi có thể sử dụng để thực hiện tự động hoàn thành tìm kiếm khi bạn nhập tự động hoàn thành tại dòng lệnh?

Ai đó có thể chứng minh chương trình Haskell thực hiện việc này không? Tôi nghĩ rằng vấn đề của tôi nằm trong việc buộc đánh giá lại mọi đầu vào nhân vật. Cảm ơn một triệu trước.

+0

Điều này ít về khả năng của Haskell và nhiều hơn nữa về khả năng của dòng lệnh. Nói chung, tôi không nghĩ rằng mã của bạn có thể biết những gì được viết trong dòng lệnh trước khi người dùng nhấn [Enter]. –

+1

@ KarolisJuodelė Tôi nghĩ rằng một chương trình chắc chắn có thể làm điều đó - ví dụ Vim đáp ứng với các đầu vào chính duy nhất mà không nhập được nhấn. Cách thực hiện việc này là đọc từng ký tự một lần từ thiết bị đầu cuối và sau đó cập nhật hoàn thành hoặc thực hiện một số thao tác, tùy thuộc vào việc phím được nhập hay có thể sử dụng một số loại thư viện để tạo giao diện người dùng dòng lệnh, như ncurses (được sử dụng cho nhiều chương trình dòng lệnh). – DarkOtter

+0

@DarkOtter, đó là lý do tại sao tôi nói "thường". Tôi biết rằng nó có thể được thực hiện với các thư viện phụ thuộc nền tảng (và các trình bao bọc nền tảng chéo của chúng). Tôi không nghĩ rằng sử dụng của họ nên được khuyến khích mặc dù - nếu bạn muốn có một giao diện người dùng thích hợp, sử dụng một bộ công cụ giao diện người dùng thích hợp. Tôi lo sợ rằng người mới bắt đầu có thể có được ý tưởng rằng giao diện điều khiển giao diện người dùng dễ dàng hơn, trong khi, trên thực tế, nó thường là khó khăn hơn. –

Trả lời

1

Nghiên cứu Lập trình phản ứng có thể là khởi đầu tốt.
Đối với thư viện này có vẻ là reactive banana
Có một số cơ sở example.

Nếu bạn muốn biết thêm, trên FRP, một chủ đề tuyệt vời trên stack sẽ cung cấp cho bạn một cái nhìn tổng quan rõ ràng.

2

Tôi sẽ không cố gắng viết toàn bộ chương trình Haskell mà bạn đang yêu cầu, nhưng đây là một ví dụ rất ngắn chỉ hiển thị bit mà bạn cho là bị kẹt vào lúc này: làm điều gì đó sau mỗi lần nhấn phím. Chúng tôi sẽ không làm bất cứ điều gì thú vị (chỉ cần đập một số và in nó ra), nhưng nó sẽ cho thấy làm thế nào để làm điều đó một nhiệm vụ nhỏ, và bạn có lẽ có thể bắt đầu hack từ đó.

Điều duy nhất bạn thực sự cần biết là có vẻ như bạn không thể tắt tính năng lưu vào bộ đệm trên đầu vào.

import System.IO 

loop n = do 
    c <- getChar 
    print n 
    -- do whatever recalculation you need to do here, using 
    -- n (which can be more complicated than an Integer, as 
    -- it is here, of course) and c (which is a Char 
    -- representing the key the user whacked) 
    -- our recalculation is just to increase n by one 
    loop (n+1) 

main = do 
    hSetBuffering stdin NoBuffering -- do this once before anything else 
    loop 0 
+0

Tôi chỉ chơi với điều này một chút và tôi sẽ thực hiện hai ghi chú. 1) Có thể bạn cũng muốn tắt chế độ đệm cho stdout. 2) Rất dễ dàng bỏ lỡ các ký tự đầu vào nếu vòng lặp quá chậm. Chỉ cần in lại các char với (putstr [toUpper c]) và bang trên bàn phím và bạn sẽ thấy những gì tôi có ý nghĩa. –

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