Có một cách thanh lịch đại diện cho mô hình này tại Haskell?


0 Phiếu
Đã hỏi 25/5/2016 bởi Metge (620 điểm)
Tâm tinh khiết function dưới đây, trong một ngôn ngữ bắt buộc:
def foo(x,y):
    x = f(x) if a(x)
    if c(x): 
        x = g(x)
    else:
        x = h(x)
    x = f(x)
    y = f(y) if a(y)
    x = g(x) if b(y)
    return [x,y]
rằng function đại diện cho một phong cách nơi bạn có để từng bước cập nhật các biến. Nó có thể tránh được trong hầu hết trường hợp, nhưng có những tình huống mà khuôn mẫu đó là không thể tránh khỏi - ví dụ, viết một procedure nấu ăn cho một robot, mà vốn đã đòi hỏi một loạt các bước và các quyết định. Bây giờ, hãy tưởng tượng chúng tôi đã cố gắng để đại diện cho foo trong Haskell.
foo x0 y0 =
    let x1 = if a x0 then f x0 else x0 in
    let x2 = if c x1 then g x1 else h x1 in
    let x3 = f x2 in
    let y1 = if a y0 then f y0 else y0 in
    let x4 = if b y1 then g x3 else x3 in
    [x4,y1]
code mà hoạt động, nhưng nó là quá phức tạp và error bị do sự cần thiết để tự quản lý các số thẻ. Chú ý rằng, sau khi x1 được thiết lập, x0 của value không bao giờ nên được sử dụng một lần nữa, nhưng nó vẫn có thể. Nếu bạn vô tình sử dụng nó, đó sẽ là một lỗi không bị phát hiện. Tôi đã quản lý để giải quyết vấn đề này bằng cách sử dụng monad trạng thái:
fooSt x y = execState (do
    (x,y) <- get
    when (a x) (put (f x, y))
    (x,y) <- get
    if c x 
        then put (g x, y) 
        else put (h x, y)
    (x,y) <- get
    put (f x, y)
    (x,y) <- get
    when (a y) (put (x, f y))
    (x,y) <- get
    when (b y) (put (g x, x))) (x,y)
bằng cách này, cần cho thẻ theo dõi đi xa, cũng như nguy cơ vô tình sử dụng một biến đã lỗi thời. Nhưng bây giờ code tiết và nhiều khó khăn hơn để hiểu, chủ yếu là do sự lặp lại của (x,y) <- get. Vì vậy: là gì một cách dễ đọc hơn, thanh lịch và an toàn để nhận mô hình này? đầy đủ code để thử nghiệm.

Xin vui lòng đăng nhập hoặc đăng ký để trả lời câu hỏi này.


ToughDev Q&A là gì?

Trang web hỏi đáp cho các bạn đam mê lập trình, phát triển phần mềm và các vấn đề kỹ thuật khác. Với sự giúp đỡ của bạn, chúng tôi hy vọng sẽ xây dựng thành công một thư viện đầy đủ các câu hỏi và trả lời về tất cả các vấn đề có liên quan đến lập trình!







...