Functor, Applicative and Monad
TIL
488
Monad
3
White

kiennt viết ngày 16/09/2016

Một vài khái niệm:

Concrete type: kiểu dữ liệu cụ thể, không nhận bất cứ tham số nào. VD: Int, Bool,

Construct type: kiểu dữ liệu nhận các tham số để tạo nên một Concrete Type

VD:

data Maybe a :: Nothing || Just a

Maybe là một Construct type. Maybe Int là một Concrete type

List là một Construct type. [Int] là một Concrete typetype

Functor

Functor là một Construct type nhận duy nhất một tham số

class Functor f where
    fmap :: (a -> b) -> f a -> fb

Hàm fmap của Functor phải tuân theo luật của Fuctor

fmap id = id
fmap f . fmap g = fmap (f .g)

Có thể tưởng tượng mỗi một instance của Functor là một giá trị được chứa trong một ngữ cảnh (context).
Hàm fmap sẽ map một hàm bất kỳ và một Functor để tạo thành một Functor khác

List là một Functor với fmap là hàm map
Maybe cũng là một Functor

instance Functor Maybe where
   fmap f Nothing = Nothing
   fmap f Just a = Just (f a)

Applicative

Applicative là một Functor thoả mãn điều kiện

class (Fuctor f) => Applicative f where
   pure :: a -> f a
   <*> :: f (a -> b) -> f a -> f b

Luật của Applicative

pure f <*> x = fmap f x 

Maybe là một Applicative

instance Applicative Maybe where
   pure = Just
   Nothing <*> _  = Nothing
   Just f <*> something = f <$> something

Applicative hỗ trợ thêm Fuctor 2 hàm

  • pure: Giúp chúng ta bao một giá trị với context
  • <*> (tôi thường gọi hàm này là apply, nhưng trong giới làm scala, hàm này thường được gọi là map): Giúp chúng ta áp dụng một context chứa hàm với một context chứa giá trị để tạo ra một context chứa giá trị mới

Monad

Monad là một Applicative type thoả mãn

class Monad m where
  return :: a -> m a
  >>= :: m a -> (a -> m b)  -> m b

Luật của Monad

return a >>= k = k a
m >>= return = m
(m >>= k) >>= h = m >>= (\a -> k a >>= h)

Maybe là một Monad

instance Monad Maybe where
   return = Just
   Nothing >>= _ = Nothing
   Just x >>= f = f x

List là một Monad

instance Monad [] where
   return x = [x]
   xs >>= f = concat (map f xs)

Hàm >>= trong haskell thường được gọi là hàm bind, nhưng trong Scala, hàm này thường được gọi là flatMap

kiennt 25-05-2016

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

kiennt

29 bài viết.
228 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
81 18
Mọi chuyện bắt đầu từ nắm 2013 trong quá trình xây dựng chức năng login với Facebook, tôi đã tìm ra một cách để tấn công vào các hệ thống login với...
kiennt viết gần 2 năm trước
81 18
White
26 5
1. Đặt vấn đề Một trong các vấn đề của một hệ thống backend là bài toán điều phối request tới các nguồn dữ liệu. Xét bài toán với một hệ thống bl...
kiennt viết hơn 1 năm trước
26 5
White
22 4
Mở đầu Tôi đang học về (Link) (Link) (hệ thống phân tán). Đây là một lĩnh vực rất hay và khó (đối với tôi). Phần lớn các hệ thống máy tính hiện na...
kiennt viết hơn 1 năm trước
22 4
Bài viết liên quan
White
31 16
Mình tìm thấy một bài rất hay về Functional Programming (lập trình hàm), giải thích các khái niệm bằng hình vẽ dễ hiểu. Bài này mình sẽ dịch lại và...
Vu Nhat Minh viết hơn 1 năm trước
31 16
White
4 0
Hôm nay vừa implement thử phiên bản nhỏ gọn cho Reader Monad trên Scala và Swift. Reader Monad là một trong 3 monad hay dùng và được implement cụ t...
Vu Nhat Minh viết hơn 1 năm trước
4 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
29 bài viết.
228 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!