Tôi đã cố gắng để thực hiện các chức năngLẫn lộn về tách lạng bộ và điểm phong cách tự do trong Haskell
every :: (a -> IO Bool) -> [a] -> IO Bool
đó là chủ đề cho this question. Tôi đã cố gắng thực hiện điều này mà không cần đệ quy rõ ràng. Tôi đã đưa ra mã sau đây
every f xs = liftM (all id) $ sequence $ map f xs
Chức năng của tôi không hoạt động vì nó không phải là lười (bắt buộc trong câu hỏi), vì vậy không có upvotes ở đó :-).
Tuy nhiên, tôi không dừng ở đó. Tôi đã cố gắng thực hiện chức năng điểm miễn phí để nó sẽ ngắn hơn (và thậm chí có thể mát hơn). Kể từ khi lập luận f
và xs
là những người cuối cùng trong biểu thức tôi chỉ bỏ chúng:
every = liftM (all id) $ sequence $ map
Nhưng điều này không làm việc như mong đợi, trên thực tế nó đã không làm việc ở tất cả:
[1 of 1] Compiling Main (stk.hs, interpreted) stk.hs:53:42: Couldn't match expected type `[m a]' against inferred type `(a1 -> b) -> [a1] -> [b]' In the second argument of `($)', namely `map' In the second argument of `($)', namely `sequence $ map' In the expression: liftM (all id) $ sequence $ map Failed, modules loaded: none.
Tại sao vậy? Tôi đã có ấn tượng rằng có thể đơn giản là bỏ qua các đối số hàm sau, mà về cơ bản là những gì currying là về.
Hoặc bạn có thể sử dụng -XNoMonomorphismRestriction và thả loại sig rõ ràng. –
Argh ... định nghĩa 'chấm' trông giống như ai đó đang nhìn chằm chằm vào tôi. – gawi