dụ của bạn có chứa một vài điều mà sẽ làm việc khác nhau trong một ngôn ngữ chức năng:
- lớp là có thể thay đổi - trong ngôn ngữ chức năng, bạn sẽ sử dụng một loại bất biến
- bạn đang sử dụng
current_time
để có được thời gian hiện tại, nhưng điều này không phải là một hàm thuần túy (nó phụ thuộc vào một số trạng thái thay đổi toàn cục). Trong tinh khiết ngôn ngữ chức năng (Haskell), điều này là không được phép (và bạn phải sử dụng monads), nhưng hầu hết các ngôn ngữ chức năng không tinh khiết (F #, OCaml) cho phép điều này.
- Chức năng
main
của bạn sử dụng vòng lặp thường không được khuyến khích bằng các ngôn ngữ chức năng (mặc dù một số hỗ trợ chúng).
Chiếc F # giải pháp thành ngữ sẽ đối phó với người đầu tiên và điểm cuối cùng như thế này:
let currentTime() =
System.DateTime.Now
type State(startTime) =
static member Start() =
State(currentTime())
member x.IsCompleted =
(currentTime() - startTime).TotalSeconds > 30.0
member x.Progress =
(currentTime() - startTime).TotalSeconds/30.0
let main() =
let s = State.Start()
let rec loop() =
if not s.IsCompleted then
printf "%A" s.Progress
loop()
loop()
printf "finished"
Loại State
là bất di bất dịch theo nghĩa là nó không bao giờ thay đổi giá trị của trường địa phương. Nó không hoàn toàn là chức năng, bởi vì nó phụ thuộc vào thời gian hiện tại (thay đổi), nhưng đó không phải là một vấn đề trong F # (bạn chỉ cần phải nhận thức được điều đó).Nếu bạn cần một số phương pháp sửa đổi trạng thái (mà bạn không) thì phương thức sẽ trả về một cá thể mới là State
(giống như .NET string
).
Chức năng main
được viết bằng cách sử dụng đệ quy thay vì vòng lặp - trong trường hợp này, nó không thực sự quan trọng (vòng lặp sẽ ổn trong F # quá). Điểm của việc sử dụng đệ quy là bạn có thể chuyển trạng thái hiện tại làm đối số và sử dụng một cá thể mới khi thực hiện một cuộc gọi đệ quy (mà về cơ bản thay đổi trạng thái hiện tại trong khi tính toán).
Nguồn
2011-06-19 09:38:41
Xem thêm http://stackoverflow.com/questions/5773070/how-are-mutable-arrays-implemented-in-haskell và http://stackoverflow.com/questions/tagged/haskell+monads –