2012-09-20 42 views
5

Tôi hiện đang theo dõi các bài tập trong cuốn sách: "Trường biểu đạt Haskell" và đã đạt đến chương thứ ba về cách tạo đồ họa. Cuốn sách sử dụng mô-đun SOEGraphics và minh họa vẽ một số văn bản đơn giản trong một cửa sổ và sau đó đóng nó bằng một nút bấm. Tuy nhiên, khi sau khi biên dịch và thực hiện, tôi thấy rằng mặc dù cửa sổ xuất hiện với văn bản trên màn hình, cửa sổ từ chối đóng bất kể tôi nhấn phím nào hay tập trung vào dòng lệnh hay chính cửa sổ.Cửa sổ Haskell SOEGraphics sẽ không đóng

Đây là mã nguồn từ cuốn sách:

module Main where 
import SOE 
main = runGraphics(
     do w <- openWindow 
       "My First Graphics Program" (300, 300) 
      drawInWindow w (text(100,200) "HelloGraphicsWorld") 
      k <- getKey w 
      closeWindow w 
     ) 

Cách duy nhất để có được những cửa sổ đóng cửa là bằng cách buộc nó để bỏ thuốc lá với tổ hợp phím CTRL-C. Có cái gì tôi đã bỏ qua với mã của tôi? Chương trình được biên dịch bằng GHC 7.4.1 và được chạy trên Ubuntu.

+0

Bạn lấy mô-đun từ đâu? Gói HGL về hackage không xây dựng với GHC> = 7, theo như tôi thấy. –

+0

Có lẽ tôi đang bối rối về những thư viện mà tôi đang đề cập đến? Tôi làm theo hướng dẫn để có được SOEGraphics làm việc [ở đây] (http://www.cs.yale.edu/homes/hudak/SOE/software1.htm) –

+0

Được rồi, đó là một nguồn khá gần đây, do đó, nó _should_ làm việc.Tôi không biết rằng mã SOE đã được di chuyển ra khỏi HGL một lần nữa, và liên kết của bạn với các tài liệu ôm (phát hành cuối cùng của ôm là tháng 9 năm 2006!) Làm cho tôi tự hỏi. Tôi không biết những gì có thể gây ra hang, mặc dù. Nó có thể được đệm, để bấm phím chỉ được gửi sau khi nhấn ' '? (Không chắc chắn, nhưng tôi đoán là tôi chỉ có thể cung cấp.) –

Trả lời

2

Hãy thử getKeyChar intead của getKey. Dường như đã có sự thay đổi trong phương pháp ưa thích để sử dụng và/hoặc hành vi trong một số hệ điều hành nhất định.

0

Tôi đang sử dụng gói current release của gói SOE, được phát hành khoảng 9 tháng trước ngày câu hỏi. Giống như áp phích của câu hỏi, tôi đang chạy GHCi 7.4.1 trên Ubuntu (12.04). Tôi đã gặp phải vấn đề tương tự, nhưng câu trả lời của DuckMaestro không áp dụng:

getKeyChar không được định nghĩa trong bất kỳ mô-đun nào trong gói SOE. Tuy nhiên, getKeyEx là:

Mặc dù không có cơ sở trong gói DNNN chính nó, chức năng này dường như bắt chước namesake trong module Graphics.HGL.Utils của nó.

Tuy nhiên, trong khi getKey được xuất từ ​​mô-đun SOE, getKeyEx thì không.

Để biên dịch và có cửa sổ đóng trên một sự kiện bấm phím

  1. xuất khẩu getKeyEx từ các module DNNN
  2. trong các mã được trích dẫn trong các câu hỏi, thay đổi k <- getKey w để k <- getKeyEx w True
0

Daniel là chính xác nhưng tôi thấy nó lạ rằng getKeyEx hoạt động khi getKey mà chỉ sử dụng getKeyEx thì không. Vì vậy, tôi nhìn. Vấn đề là khá rõ ràng. Đây là mã hiện tại cho getKey

getKey win = do 
    ch <- getKeyEx win True 
    if ch == '\x0' then return ch 
    else getKeyEx win False 

Đây là những gì nó phải được

getKey win = do 
    ch <- getKeyEx win True 
    if ch /= '\x0' then return ch 
    else getKeyEx win False 

Hãy sửa lỗi này và getKey hoạt động.

+0

mã nằm trong SOE.hs trong thư mục SOE/src của tải xuống mã nguồn cho "Trường biểu thức Haskell" –

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