Có ổn không nếu tôi quyết định viết tất cả Ruby của mình như thể nó là Haskell?


10

Vì Ruby có khả năng vận hành danh sách tốt được tích hợp sẵn - thu nhỏ, ánh xạ, chọn, thu thập, v.v. Nó có Procs, Blocks và Lambdas và có hỗ trợ lặp tốt ( eachgia đình), đó có phải là một quyết định thiết kế tồi nếu tôi cố gắng viết tất cả những thứ Ruby của tôi theo cách tinh khiết nhất có thể? Đặc biệt đối với mã có ít hoặc không có I / O (do đó ít tác dụng phụ rõ ràng hơn)?

Tôi đã được học Haskell (được gọi là ngôn ngữ của Hacker 'thực sự) và yêu thích cách làm việc này - Tôi yêu Ruby, nhưng nghĩ rằng nó còn vui hơn nữa khi tinh thần Haskell chảy vào đó (tốt, không Ruby t mượn / học hỏi nhiều từ nó ngay từ đầu?)

Hướng dẫn xây dựng được chào đón ...


13
Tại sao không chỉ viết bằng Haskell?

1
Tôi sẽ viết bằng Haskell một mình, nhưng Ruby không tệ đến mức đáng bị vứt bỏ hoàn toàn. Tôi thích thực tế là tôi có thể sử dụng nó khi viết kịch bản, và trong nhiều thử nghiệm nhanh, tôi thích hack cùng nhau khi học các công cụ AI. Nhưng có lẽ cũng bởi vì tôi mới bắt đầu học Haskell, cuối cùng có thể làm theo lời khuyên của bạn :-)
nemeisfixx

2
Tôi không hiểu tại sao bạn lại xin phép Stack Overflow. Nếu bạn đang viết mã mà bạn sẽ chia sẻ với những người khác trong một nhóm, bạn sẽ phải phối hợp các kiểu mã hóa của mình. Nếu không, nó có vấn đề gì?
Mike Daniels

Tại sao lại hỏi SO? bởi vì tôi tôn trọng ý kiến ​​trung thực của các hacker và lập trình viên giàu kinh nghiệm. Có thể có những lợi ích trong việc sử dụng một cách tiếp cận chức năng thuần túy để lập trình mà những bộ óc có kinh nghiệm có thể chia sẻ với tôi (và những người khác như tôi).
nemeisfixx

Xem xét rằng có những lý do khách quan cho "không", đây là một câu hỏi chính đáng.
Andrew Grimm

Câu trả lời:


16

Tôi đã làm điều này với python. Tôi thấy rằng nó là cồng kềnh để ghi trong một hereditarily phong cách chức năng thuần túy trong một ngôn ngữ mà không được thiết kế cho nó. Ví dụ: đối chiếu hai định nghĩa của in_order :

def in_order(xs):
    for i in range(1,len(xs)):
        if xs[i] > xs[i+1]:
            return False
    return True

inOrder :: (Ord a) => [a] -> Bool
inOrder xs = and $ zipWith (<=) xs (tail xs)

Viết in_ordercách Haskell trong python sẽ là cả dài dòng (vì python không hỗ trợ tốt các thành ngữ cần thiết) và chậm (không gian tuyến tính thay vì không gian liên tục của Haskell do lười biếng).

Tuy nhiên, tôi đã thành công khi tạo các chương trình python với tổ chức chức năng và triển khai thành ngữ cho từng chức năng. Ý tưởng rằng đây là một cách tốt để lập trình thực sự là luận điểm đằng sau dự án codecatalog của tôi . Vì vậy, các thành phần của tôi được định hướng xung quanh các khái niệm trừu tượng và các chức năng (với giao diện thuần túy ) hoạt động trên chúng, thay vì các lớp có trạng thái và nó sẽ kết hợp với nhau một cách độc đáo. Trong thực tế, mã được tổ chức theo cách này dường như linh hoạt hơn để sử dụng lại so với mã được tổ chức với các lớp. Đó có thể là một thành kiến ​​cá nhân, tuy nhiên, vì tôi vẫn là một tín đồ của Haskell.

Vì vậy, tôi sẽ nói câu trả lời cho câu hỏi của bạn là kinda . Sử dụng nguồn gốc chức năng của bạn để giúp bạn suy nghĩ, nhưng đừng lạm dụng nó. Ví dụ. mô phỏng các danh sách lười biếng trong Ruby chỉ vì thành ngữ có lẽ sẽ gặp nhiều rắc rối hơn giá trị của nó.


Bằng cách nào đó mô tả của bạn làm tôi nghĩ về pascal.
ras camera

@ras camera, oh? Bất kỳ lý do tại sao?

Tôi không biết, có thể nó không hiểu tiếng Anh tốt hoặc những gì bạn mô tả phù hợp với cách thức (tôi ít nhất) những thứ được sắp xếp / cấu trúc trong các đơn vị pascal. Chỉ là một loại kết nối tinh thần, có thể không có bất kỳ kết nối thực sự nào do tùy chọn đầu tiên;)
ras camera

1
Câu lệnh "không gian tuyến tính thay vì không gian liên tục của Haskell do sự lười biếng" không chính xác. Lười biếng vẫn ngụ ý trật tự tuyến tính. Tôi hiểu quan điểm của bạn tuy nhiên.

3
@aromero, tôi không hiểu bạn, mặc dù. Thứ tự phải làm gì với nó? Không gian liên tục đến từ rác Haskell thu thập những người đứng đầu danh sách so sánh sau khi andtiêu thụ chúng; nó sẽ hành xử giống như một vòng lặp. Trong khi đó, danh sách so sánh của python sẽ phải được tạo đầy đủ trước khi tương tự andsẽ thấy bất kỳ trong số chúng (trừ khi bạn sử dụng máy phát điện ... mà tôi cho là có khả năng).

7

Bạn có thể viết mã Ruby theo kiểu chức năng như thể đó là Scheme chứ không phải Haskell. Để viết nó như thể nó là Haskell, nó sẽ cần một hệ thống kiểu giống như Haskell, cộng với đánh giá lười biếng lan tỏa.


1

Tôi đã tìm thấy sự hiểu biết về lập trình chức năng và đặc biệt là Haskell, sẽ hữu ích cho tôi trong những tình huống nhất định mà tôi gặp phải trong Ruby. Nhưng càng học Haskell, tôi càng nhận ra Ruby từ bao giờ có thể giống Haskell đến mức nào.

Tình huống tải mô-đun / mã là rất nhiều, vì một điều. Trình thông dịch hiện tại không bật tối ưu hóa cuộc gọi đuôi, vì vậy bạn không thể sử dụng đệ quy theo cách bạn làm trong Haskell. Và một khi bạn vào Monads, thực sự không có sự so sánh nào về mức độ trừu tượng mà bạn có thể đạt được trong Haskell so với Ruby.

Nếu bạn quan tâm, tôi đã đăng một số mã so sánh Ruby / Haskell trên gist.github.com khi tôi đang tìm hiểu.

Kỹ thuật mà tôi đã mang đến cho Ruby đã phát huy tốt nhất là tìm các hàm thuần túy ở nơi tôi có thể, đó là những gì nghe có vẻ như bạn đang cố gắng thực hiện.


Trong một trong những thử nghiệm Smalltalk của tôi : self assert: ((m >>= f) >>= g) equals: (m >>= [:x | (f value: x) >>= g]). Không có lý do nào cả tại sao bạn không thể sử dụng các đơn nguyên một cách có ý thức , trái ngược với việc sử dụng chúng mà không hề biết bạn đang sử dụng chúng (như danh sách).
Frank Shearar

0

Tôi sẽ nói có". Điều tôi (tôi nghĩ) bạn đang nói đến là ảnh hưởng lập trình chức năng trong ngôn ngữ ruby. Mô hình chức năng có một số khái niệm thực sự tốt đẹp khen ngợi hoặc chồng chéo với hướng đối tượng (đặc biệt không có tác dụng phụ).

Điều tuyệt vời về ruby ​​là nó cho phép bạn viết mã theo kiểu tuyến tính, hướng đối tượng hoặc chức năng, hoặc một số pha trộn của những thứ này. Và tập lệnh tuyến tính đơn giản của bạn có thể biến thành kiểu OO / chức năng nếu và khi độ phức tạp của nó tăng lên.


0

Nó phụ thuộc vào việc bạn sẽ hợp tác với người khác. Nếu bạn đang tự mình làm việc với mã, hãy sử dụng bất kỳ phong cách nào bạn cảm thấy thoải mái nhất. Tuy nhiên, nếu bạn đang làm việc với các lập trình viên Ruby khác, họ có thể không quen với phong cách lập trình hoàn toàn chức năng và do đó bị nhầm lẫn bởi mã của bạn. Sau đó, một lần nữa, nếu cộng tác viên của bạn cũng là lập trình viên Haskell đã di chuyển sang Ruby, bạn có thể không gặp vấn đề này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.