Trong this hướng dẫn, tôi đã tìm thấy các đoạn mã sau:lẽ đơn nguyên function bind ưu tiên
deposit :: (Num a) => a -> a -> Maybe a
deposit value account = Just (account + value)
withdraw :: (Num a,Ord a) => a -> a -> Maybe a
withdraw value account = if (account < value)
then Nothing
else Just (account - value)
eligible :: (Num a, Ord a) => a -> Maybe Bool
eligible account =
deposit 100 account >>=
withdraw 200 >>=
deposit 100 >>=
withdraw 300 >>=
deposit 1000 >>
return True
main = do
print $ eligible 300 -- Just True
print $ eligible 299 -- Nothing
tôi không thể tìm ra cách các chức năng >>=
là nghĩa vụ phải làm việc. Lúc đầu, giá trị Maybe a
là tham số đầu tiên: deposit 100 account >>=
Sau đó, có vẻ như tham số đầu tiên: withdraw 200 >>=
Làm cách nào để trình biên dịch này có thể chấp thuận? Không nên >>=
luôn lấy Maybe a
làm thông số đầu tiên?
Một giải pháp có thể sẽ là nếu ưu tiên các >>=
chức năng của sẽ làm việc theo cách sau: ((a >>= b) >>= c) >>= d
Nhưng như xa như tôi biết, nó là ngược lại: a >>= (b >>= (c >>= d))
Bạn có thể đã nhầm lẫn nó với ký hiệu 'do':' do a <- b; c <- d; e' là 'b >> = (\ a -> d >> = (\ c -> e))'. – sdcvvc
@sdcvvc: Cảm ơn bạn, đây thực sự là nguồn gốc của sự nhầm lẫn của tôi. – kahoon
Cũng lưu ý rằng nó không phải là "Có thể ưu tiên chức năng liên kết monad"; bạn không thể có các ưu tiên khác nhau cho các trường hợp typeclass khác nhau, do đó, nó sẽ phải là ưu tiên cho các liên kết * all * monads '. – Ashe