2012-01-25 17 views
7

Có thể làm cho những người hai dòng một dòng:chế biến giá trị đơn nguyên trước khi phân

main = do line <- getLine 
    let result = words line 

những gì tôi có nghĩa là một cái gì đó giống như mã không monadic

result = lời getline

đó - theo ý kiến ​​của tôi - sẽ cải thiện khả năng đọc.

Trả lời

14

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.

+0

Đó là câu trả lời hoàn hảo. Cảm ơn! – Trismegistos

+1

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. –

+1

@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. –

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