2011-08-30 30 views
6

Có lẽ tôi đang đi về điều này một cách sai, nhưng tôi đang sử dụng HXT để đọc trong một số dữ liệu đỉnh mà tôi muốn sử dụng trong một mảng trong HOpenGL. Các mảng Vertex cần phải là một Ptr được tạo ra bằng cách gọi newArray. Thật không may newArray trả về một IO Ptr, vì vậy tôi không chắc chắn làm thế nào để đi về việc sử dụng nó bên trong một mũi tên. Tôi nghĩ rằng tôi cần một cái gì đó với một tuyên bố loại tương tự như IO a -> Arrow a?Gọi một IO Monad bên trong một mũi tên

Trả lời

5

Loại IO a -> Arrow a không có ý nghĩa; Arrow là một loại loại, không phải là một loại cụ thể, giống như Monad hoặc Num. Cụ thể, một thể hiện của Arrow là một hàm tạo kiểu lấy hai tham số mô tả những thứ có thể được tạo thành như các hàm, các loại đối sánh từ đầu đến cuối. Vì vậy, việc chuyển đổi IO a thành mũi tên có thể được gọi là lỗi kiểu khái niệm.

Tôi không chắc chắn chính xác những gì bạn đang cố gắng làm, nhưng nếu bạn thực sự muốn sử dụng các hoạt động IO như một phần của Arrow, bạn cần số Arrow để bao gồm điều đó. Hình thức đơn giản nhất là quan sát các chức năng đó với các kiểu như a -> m b cho bất kỳ cá thể Monad nào có thể được tạo thành theo cách hiển nhiên. Các gói phần mềm hxt dường như cung cấp một loại phức tạp hơn:

newtype IOSLA s a b = IOSLA { runIOSLA :: s -> a -> IO (s, [b]) } 

Đây là một số hỗn hợp của IO, State, và [] monads, gắn liền với một chức năng như trên như vậy mà bạn có thể soạn họ trải qua cả ba Monad s ở mỗi bước. Tôi đã không thực sự sử dụng hxt nhiều, nhưng nếu đây là những Arrow s bạn đang làm việc với, nó khá đơn giản để nâng một chức năng tùy ý IO để phục vụ như một - chỉ cần vượt qua giá trị nhà nước s thông qua không thay đổi, và biến đầu ra của hàm thành một danh sách singleton. Có thể đã có một chức năng để làm điều này cho bạn, nhưng tôi không nhìn thấy một cái trong nháy mắt.

Về cơ bản, bạn muốn một cái gì đó như thế này:

liftArrIO :: (a -> IO b) -> IOSLA s a b 
liftArrIO f = IOSLA $ \s x -> fmap (\y -> (s, [y])) (f x) 
+1

[ 'arrIO'] (http://hackage.haskell.org/packages/archive/hxt/9.1.4/doc/html/ Control-Arrow-ArrowIO.html # v: arrIO) có vẻ là cái mà anh ta đang tìm kiếm. Việc thực hiện của nó về cơ bản giống với của bạn. – hammar

+0

@hammar: * Aha! * Cảm ơn, vì lý do nào đó, tôi cho rằng nó sẽ có "nâng" trong tên. –

+0

Ahhh có, đó là chính xác! Mỗi lần tôi nghĩ rằng tôi đã có mũi tên và monads đã tìm ra tôi gió lên tìm chúng ra trên một lần nữa ... – John

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