Hãy thử điều này: result <- fmap words getLine
fmap
mất một chức năng với một kiểu giống như a -> b
và biến nó thành f a -> f b
cho bất cứ điều gì đó là một thể hiện của Functor
, mà nên bao gồm tất cả Monad
trường.
Có chức năng tương đương được gọi là liftM
, cụ thể là Monad
, vì lý do lịch sử không rõ ràng. Thay vào đó, bạn có thể cần phải sử dụng điều đó trong một số trường hợp, nhưng đối với các đơn vị chuẩn như IO
, bạn có thể gắn bó với fmap
.
Bạn cũng có thể nhập Data.Functor
hoặc Control.Applicative
để có được một phiên bản điều hành tốt đẹp của fmap
, vì vậy bạn có thể viết words <$> getLine
thay vào đó, mà thường trông đẹp hơn.
Nguồn
2012-01-25 18:38:01
Đó là câu trả lời hoàn hảo. Cảm ơn! – Trismegistos
Tôi không tích cực điều này giúp dễ đọc, mặc dù; Tôi nghĩ ban đầu của bạn đôi khi có thể tốt hơn. –
@LouisWasserman: Nếu một giá trị trung gian như 'dòng' ở đây chỉ được sử dụng một lần trong một biểu thức đơn giản, nó thường dễ đọc hơn để làm những việc theo cách này. Đặt tên một giá trị có nghĩa là nó có thể được sử dụng ở bất kỳ đâu trong phạm vi đó, tạo ra một thứ nữa để theo dõi khi đọc toàn bộ định nghĩa. –