Điều gì sẽ là tương đương với chương trình chức năng của mẫu thiết kế nhà nước? Hay cụ thể hơn, cách this Wikipedia example của mẫu thiết kế nhà nước sẽ dịch sang FP như thế nào?Tương đương chức năng của mẫu thiết kế nhà nước
Trả lời
Có thể với một đơn vị State
kết hợp với công cụ sửa đổi tùy chỉnh và người truy cập?
Tôi không nghĩ rằng có chức năng tương đương thuần túy cho mẫu trạng thái. Bởi vì lập trình hàm thuần túy không có khái niệm về trạng thái và thời gian. Mẫu trạng thái thực chất về trạng thái và thời gian. Nhưng tôi nghĩ rằng tương đương chức năng không thuần túy tồn tại, đó là luồng vô hạn được đánh giá lười biếng. Bạn có thể thực hiện nó với C# yield.
FP thực sự có trạng thái. Chưa bao giờ nghe nói về monads? Thậm chí còn có một cái gì đó gọi là lập trình chức năng phản ứng để nắm bắt trạng thái biến đổi theo thời gian. – fuz
xin lưu ý rằng tôi đã sử dụng các từ "thuần túy" và "không thuần túy" – Dagang
Tôi không nghĩ "có" là từ đúng để kết nối "lập trình chức năng" và "trạng thái". Tôi thích nghĩ về nó như là "mô hình" - chúng ta có thể thực hiện các phép tính trạng thái bằng cách xây dựng một mô hình chức năng về ý nghĩa của trạng thái. – luqui
Mẫu này là một ví dụ về việc sử dụng mã số State monad, một mã số tính toán sẽ làm tăng thêm mã với trạng thái.
Đây là triển khai trong Haskell.
Một số những người giúp đỡ:
import Control.Monad.Trans.State
import Control.Monad.IO.Class
import Data.Char
Hai phương thức hoạt động của chương trình
data Mode = A | B
Các loại tính stateful với chế độ này, tăng cường với một bộ đếm.
type StateM a = StateT (Int, Mode) IO a
Chức năng ghi, một chức năng trong bối cảnh StateM, thay đổi hành vi của nó dựa trên chế độ stateful:
writeName :: String -> StateM()
writeName s = do
(n,mode) <- get
case mode of
A -> do liftIO (putStrLn (map toLower s))
put (0,B)
B -> do let n' = n + 1
liftIO (putStrLn (map toUpper s))
if n' > 1 then put (n', A)
else put (n', B)
Chạy chương trình, tung ra một tính toán stateful ban đầu trong trạng thái Một
main = flip runStateT (0, A) $ do
writeName "Monday"
writeName "Tuesday"
writeName "Wednesday"
writeName "Thursday"
writeName "Saturday"
writeName "Sunday"
Từ mã trên, đầu ra của chính là:
monday
TUESDAY
WEDNESDAY
thursday
SATURDAY
SUNDAY
Lưu ý rằng đây là giải pháp hoàn toàn chức năng. Không có bản cập nhật có thể thay đổi hoặc phá hoại trong chương trình này. Thay vào đó, trình đơn trạng thái đề ra chế độ mong muốn thông qua tính toán.
Tôi sẽ không nói đây là một bảng mã trung thành: ở đây chúng ta phải khai báo tất cả các chế độ ở một nơi ('chế độ dữ liệu'), trong khi đó các khai báo mẫu wikipedia có thể được kết hợp theo kiểu mô-đun. – luqui
Đó là bản dịch chuẩn cho các kiểu dữ liệu đã đóng trong ngôn ngữ kiểu ML. Rõ ràng, chúng ta có thể sử dụng các kiểu dữ liệu mở thông qua các hàm hoặc các lớp kiểu, nhưng tôi nghĩ nó không liên quan đến vấn đề này. –
Tôi tò mò đó là bản dịch chuẩn, và ý bạn là gì theo tiêu chuẩn. – luqui
Một mã hóa:
import Data.Char (toUpper, toLower)
newtype State = State { unState :: String -> IO State }
stateA :: State
stateA = State $ \name -> do
putStrLn (map toLower name)
return stateB
stateB :: State
stateB = go 2
where
go 0 = stateA
go n = State $ \name -> do
putStrLn (map toUpper name)
return $ go (n-1)
Đừng để bị lừa bởi các IO
, đây là một bản dịch tinh khiết của mẫu đó (chúng tôi không sử dụng một IORef
để lưu trữ các tiểu bang hoặc bất cứ điều gì). Mở rộng newtype
, chúng ta thấy những gì có nghĩa là loại này:
State = String -> IO (String -> IO (String -> IO (String -> ...
Phải mất một chuỗi, hiện một số I/O và yêu cầu một chuỗi khác vv
Đây là mã hóa yêu thích của tôi về mô hình lớp trừu tượng trong OO: abstract class -> type, subclasses -> các phần tử của kiểu đó.
Tuyên bố newtype State
thay thế cho tuyên bố tóm tắt writeName
và chữ ký của nó. Thay vì chuyển một số StateContext
vào đó chúng tôi chỉ định một trạng thái mới, chúng tôi chỉ trả lại trạng thái mới.Việc nhúng giá trị trả lại trong IO
cho biết rằng trạng thái mới được phép phụ thuộc vào I/O. Kể từ đó không phải là về mặt kỹ thuật cần thiết trong ví dụ này, chúng ta có thể sử dụng các loại nghiêm ngặt hơn
newtype State = State { unState :: String -> (State, IO()) }
trong đó chúng ta vẫn có thể thể hiện tính toán này, nhưng trình tự của các quốc gia là cố định và không được phép phụ thuộc vào đầu vào. Nhưng hãy gắn bó với loại ban đầu, khoan dung hơn.
Và đối với những "khách hàng thử nghiệm":
runState :: State -> [String] -> IO()
runState s [] = return()
runState s (x:xs) = do
s' <- unState s x
runState s' xs
testClientState :: IO()
testClientState = runState stateA
[ "Monday"
, "Tuesday"
, "Wednesday"
, "Thursday"
, "Saturday"
, "Sunday" ]
P.S. Bạn sẽ cần phải nắm bắt các truy vấn toggling ngữ nghĩa là tốt. –
@Don, oh, phải. hmm .... – luqui
Đối với những gì nó có giá trị, tôi muốn nói phong cách mã hóa này là lý tưởng chỉ cho các lớp OO-idiomatic đúng đóng gói hành vi trừu tượng. Một số "lớp" bị cáo buộc trong mã OO bị cáo buộc là gần gũi hơn với bản dịch vụng về của phong cách Don đã sử dụng và do đó được hưởng lợi từ việc được quay trở lại những gì họ muốn ở nơi đầu tiên ... –
- 1. Viết tắt của Nhà nước từ Tên Nhà nước
- 2. nhà máy phương pháp thiết kế mẫu
- 3. Chức năng tương đương cho file_get_contents()?
- 4. C-tương đương với chức năng 'setw'
- 5. R tương đương với chức năng lọc của MATLAB
- 6. Numpy tương đương với chức năng tìm kiếm của Matlab?
- 7. Chức năng tương đương với "_getch()" của C trong Java?
- 8. Thiết kế Driven Miền trong Lập trình Chức năng?
- 9. Mẫu thiết kế nào đối diện với mẫu Nhà máy?
- 10. Để sử dụng hay không sử dụng Mẫu Nhà nước?
- 11. C - Thiết kế miễn phí của riêng bạn() chức năng
- 12. Mẫu thiết kế iOS tương đương khi đến từ thế giới C#/Java?
- 13. Chức năng tương đương với đa đồng thời
- 14. Cách tốt nhất, sử dụng mẫu thiết kế "Nhà nước", để thay đổi trạng thái là gì?
- 15. Mẫu thiết kế F #
- 16. thủ thiết lập một nhà nước UIButton
- 17. Đối tượng nhà máy và chức năng của nhà máy
- 18. Một mẫu thiết kế cho các nhà xây dựng
- 19. Thiết kế cho máy nhà nước đa cấp và phân cấp
- 20. Mẫu thiết kế nào?
- 21. Nhà máy Castle Windsor Nhà máy được nhập tương đương
- 22. Chức năng tương đương Matlab Bwareaopen trong OpenCV
- 23. Chức năng 'nth_element' tương đương trong Java là gì?
- 24. Mẫu thiết kế kiến trúc
- 25. khả năng kiểm thử của thiết kế
- 26. SQLite tương đương với SQL Server Chức năng DateAdd
- 27. Application.DoEvents() -> Chức năng tương đương trong java?
- 28. Chức năng tương đương với IO.Path.GetFileName cho url?
- 29. Có chức năng ngủ Jquery hoặc Javascript tương đương không?
- 30. Java tương đương với bản đồ chức năng trong Python
Đồng ý, trông giống như một sử dụng cụ thể của 'State' đơn nguyên với tôi quá. –