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
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. IO bên trong Get Monad
- 2. Haskell: Bị mắc kẹt trong IO monad
- 3. mạng gọi IO từ bên trong haskeline
- 4. không thể tìm thấy một mũi tên bên phải unicode
- 5. nghĩa mũi tên bên phải trong Scala
- 6. Traverse_ của Scalaz với IO monad
- 7. Mũi tên Haskell bên trong Tuples
- 8. Kết quả của monad bên trong biến áp monad
- 9. vẽ một mũi tên bên trong ô bảng bằng cách sử dụng CSS
- 10. Thêm mũi tên bên dưới trục x trong ô R
- 11. graphviz dot: cách chèn mũi tên từ một nút vào giữa mũi tên
- 12. HowTo: Vẽ một đường thẳng với một mũi tên?
- 13. Cách ẩn các nút mũi tên trong một JScrollBar
- 14. Tệp IO bên trong CasperJS
- 15. Gọi một hàm quá tải ở một số không gian tên từ bên trong một không gian tên
- 16. Làm thế nào để thêm IO vào monad của riêng tôi trong Haskell?
- 17. Chọn một hàng trong một DataGridView và có mũi tên trên tiêu đề hàng theo
- 18. setDisplayHomeAsUpEnabled() + Mũi tên lên?
- 19. Gọi một lớp bên trong một lớp khác trong PHP
- 20. Định vị mũi tên trong fancybox
- 21. Mũi tên trong Hộp thoại jQuery
- 22. Trích xuất một giá trị Có lẽ trong IO
- 23. Mũi tên/HXT và Chữ ký Loại
- 24. Đồ họa Rùa là một Haskell Monad
- 25. Matplotlib: Vẽ một mũi tên thẳng đứng trong một âm mưu log-log
- 26. gửi một hàm jquery gọi lại bên trong một biến
- 27. Gọi một đối tượng bên trong một hàm
- 28. gọi một phương thức tĩnh bên trong một lớp học?
- 29. mã và mã mũi tên
- 30. Lấy tên hàm người gọi bên trong một hàm khác trong Python?
[ '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
@hammar: * Aha! * Cảm ơn, vì lý do nào đó, tôi cho rằng nó sẽ có "nâng" trong tên. –
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