Tôi muốn tuần tự soạn hai hành động đơn lẻ trong Haskell, loại bỏ bất kỳ giá trị nào được tạo ra bởi lần thứ hai và chuyển đối số cho cả hai hành động. Hiện nay tôi đang sử dụng một do-block như thế này:Thêm hành động mà không thay đổi kết quả thành ký hiệu tái cấu trúc
ask = do
result <- getLine
putStrLn result
return result
Tôi đã hy vọng để viết này điểm nhiều hơn một chút miễn phí và gọn gàng, vì vậy tôi cố gắng này:
ask' = getLine <* putStrLn
Tuy nhiên, điều này doesn' t thậm chí kiểm tra kiểu và vấn đề là <*
không chuyển kết quả của hành động đầu tiên sang hành động thứ hai. Tôi muốn chuỗi các hành động như >>=
, nhưng không thay đổi kết quả. Loại phải là (a -> m b) -> (a -> m c) -> (a -> m b)
, nhưng Hoogle cho kết quả không phù hợp. Điều gì sẽ là một nhà điều hành để đạt được thành phần chức năng này?
Vì vậy, bạn muốn 'getline >> = \ x -> putStrLn x >> trở lại x' tại điểm theo phong cách tự do. Bạn đã hỏi lambdabot chưa? Nó nói 'liftM2 (>>) putStrLn return = << getLine'. –
@ ThomasM.DuBuisson Có vẻ như Lambdabot tìm thấy hầu hết các chức năng chính xác mà OP muốn! 'flip (liftM2 (>>)) :: Monad m => (a -> mb) -> (a -> mc) -> (a -> mb)' - loại thực tế được tổng quát hơn một chút vì vậy nó có phần khó thấy. – user2407038
@ ThomasM.DuBuisson Cảm ơn bạn, tôi đã hỏi công cụ dòng lệnh 'pointfree', và nó không thể xử lý' do', vì vậy tôi đã từ bỏ. Tôi đã kết thúc bằng cách sử dụng 'ask = getLine >> = liftM2 (>>) putStrLn return', có vẻ ổn, cảm ơn một lần nữa! Bạn có thể đặt câu trả lời này vào câu trả lời nếu bạn muốn, sau đó tôi có thể đánh dấu nó là đã được giải quyết. – amoebe