Vòng bi có trên mã có thể được chia thành hai bộ vấn đề (tôi sử dụng Haskell để minh họa). Cú pháp thực thi.
Cú pháp Issue 1:
tách lạng bộ cho phép rõ ràng đang lớn hơn trong một số trường hợp. Độ rõ ràng là gì? Đọc chức năng cung cấp dấu hiệu rõ ràng về chức năng của nó. ví dụ: Chức năng bản đồ.
map : (a -> b) -> ([a] -> [b])
đọc theo cách này, chúng ta thấy rằng bản đồ là một hàm bậc cao mà thang máy một chức năng chuyển as
-bs
đến một chức năng cho phép bạn biến [a]
-[b]
.
Trực giác này đặc biệt hữu ích khi hiểu các biểu thức như vậy.
map (map (+1))
Bản đồ bên trong có loại trên [a] -> [b]
. Để tìm ra loại bản đồ bên ngoài, chúng tôi đệ quy áp dụng trực giác của chúng tôi từ trên cao. Bản đồ bên ngoài do đó nâng cao [a] -> [b]
đến [[a]] -> [[b]]
.
Trực giác này sẽ đưa bạn chuyển tiếp LOT. Khi chúng tôi khái quát map
thành fmap
, một map
trên các thùng chứa tùy ý, nó trở nên rất dễ đọc các biểu thức như vậy (Lưu ý tôi đã định hình loại mỗi fmap
thành một loại khác vì lợi ích của ví dụ).
showInt : Int -> String
(fmap . fmap . fmap) showInt : Tree (Set [Int]) -> Tree (Set [String])
Hy vọng điều trên minh họa rằng khái niệm khái quát về việc nâng hàm vani vào các chức năng trên một số thùng chứa tùy ý.
Cú pháp Vấn đề 2:
tách lạng bộ cũng cho phép chúng ta thể hiện chức năng ở dạng point-miễn phí.
nthSmallest : Int -> [Int] -> Maybe Int
nthSmallest n = safeHead . drop n . sort
safeHead (x:_) = Just x
safeHead _ = Nothing
Ở trên thường được coi là phong cách tốt vì nó minh họa suy nghĩ về đường ống chức năng hơn là thao tác rõ ràng dữ liệu.
Thực hiện:
Trong Haskell, điểm phong cách tự do (thông qua currying) có thể giúp chúng tôi tối ưu hóa các chức năng. Viết một hàm ở dạng tự do điểm sẽ cho phép chúng ta ghi nhớ nó.
memoized_fib :: Int -> Integer
memoized_fib = (map fib [0 ..] !!)
where fib 0 = 0
fib 1 = 1
fib n = memoized_fib (n-2) + memoized_fib (n-1)
not_memoized_fib :: Int -> Integer
not_memoized_fib x = map fib [0 ..] !! x
where fib 0 = 0
fib 1 = 1
fib n = not_memoized_fib (n-2) + not_memoized_fib (n-1)
Viết nó như là một chức năng được ghi lại trong phiên bản ghi nhớ xử lý chức năng được kết hôn làm thực thể và do đó ghi nhớ nó.
Điều gì khiến bạn nghĩ rằng các cách sử dụng khác của cụm từ này là "sai"? – dfeuer