2012-02-05 38 views
29

Nhiều hướng dẫn Haskell mà tôi đã xem xét tập trung gần như hoàn toàn trên cú pháp với phạm vi phủ sóng rất ít về cách cấu trúc chương trình.Cấu trúc cơ bản của chương trình Haskell

Ví dụ ...

Dưới đây là một phác thảo trần xương của một ứng dụng C++:

#include <iostream> 
using namespace std; 

int addition (int a, int b) 
{ 
    int r; 
    r=a+b; 
    return (r); 
} 

int main() 
{ 
    int z; 
    z = addition (5,3); 
    cout << "The result is " << z; 
    return 0; 
} 

Khi tôi lần đầu tiên bắt đầu học C++, ví dụ như thế này đã giúp tôi vô cùng trong việc học cách lắp ráp riêng thành các chương trình làm việc. Có lẽ tôi đang tìm kiếm ở những nơi sai, nhưng tôi đã không thể tìm thấy bất kỳ ví dụ như vậy là trực tiếp và đơn giản cho Haskell.

Tôi đã biết NHIỀU cú pháp Haskell. Tôi có thể viết danh sách đệ quy, và thao tác chuỗi, số nguyên, và liệt kê ra wazoo.

Tóm tắt: Tôi chỉ muốn biết hai chương trình con và biến thay đổi trông như thế nào trong Haskell. Nếu tôi có thể có được một số hiểu biết cơ bản về cách cấu trúc một chương trình Haskell, cuối cùng tôi có thể đặt tất cả cú pháp mà tôi đã học được để sử dụng một số.

+2

Tôi sẽ bắt đầu tại các địa điểm như http://www.haskell.org/haskellwiki/Haskell_in_5_steps Tôi đang học Clojure. Tuy nhiên, tôi có cuốn sách O'Reilly Haskell và cuốn sách này - http://www.nostarch.com/lyah.htm - dường như đang nhận được nhiều đánh giá tốt. – octopusgrabbus

+3

Trong khi đây là một câu hỏi hợp pháp, cho phép tôi đề nghị bạn đang tiếp cận Haskell hơi sai. Haskell nhấn mạnh các hàm thuần túy càng nhiều càng tốt, và hầu hết các triển khai Haskell cung cấp một REPL (vòng lặp đọc-eval-print), nơi bạn có thể chơi xung quanh với các hàm bạn đã định nghĩa. Tôi khuyên bạn nên, thay vì làm cho các chương trình nhỏ in ra stdout, chỉ cần viết các hàm và chơi với chúng trong ghci. Tôi nghĩ bạn sẽ thấy nó linh hoạt và thú vị hơn cho việc học Haskell. –

+0

@DanBurton Tôi có lẽ đã dành tháng cuối cùng để đọc về cú pháp và chơi xung quanh với các chức năng và khả năng hiểu danh sách trong ghci. Tôi đã sẵn sàng để làm một chương trình ngay bây giờ. (D: Bạn đang ở ngay trong đó tôi đã tiếp cận Haskell sai. Tôi đang cố gắng áp dụng các nguyên tắc lập trình thủ tục cho một ngôn ngữ lập trình hàm. Tôi vẫn đang cố gắng quấn đầu về cách biến một loạt các hàm thành một thứ gì đó –

Trả lời

32

Cấu trúc của chương trình Haskell cực kỳ đơn giản. Bạn có một chức năng main mà không IO, và đó là về nó. Vì vậy, những điều cơ bản:

module Main where 

addition a b = a + b 

main :: IO() 
main = do let z = addition 5 3 
      putStrLn $ "The result is: " ++ show z 

Bây giờ bạn có thể biên dịch này vào một chương trình đơn giản sử dụng một cái gì đó như:

ghc --make Main.hs -o program 

và nó sẽ tạo ra một thực thi gọi là chương trình.

Nói chung, các chương trình được cấu trúc như hầu hết các hàm thuần túy thực hiện tính toán thực tế cùng với các phần rời rạc của mã giao dịch với IO. (Tất nhiên là có ngoại lệ cho điều này, nhưng ý tưởng chung về viết nhiều mã thuần nhất có thể là khá phổ quát.)

Vì hầu hết mọi thứ được biểu diễn dưới dạng một hàm thuần túy, bạn không truyền các biến giữa chúng các hàm giao tiếp bằng cách truyền các đối số.

Phần mã của bạn IO được neo trong main. Trong hầu hết các trường hợp, tất cả IO của bạn sẽ đi qua chính; ngay cả khi bạn viết riêng các hành động IO và đặt tên cho chúng, chúng cuối cùng sẽ được thực hiện bắt đầu từ main.

Một "nhóm chức năng" trong Haskell được gọi là "mô-đun". Bạn có thể có nhiều mô-đun, mỗi mô-đun trong tệp riêng của mình:

module Blarg (exportedFunction) where 

helper a b = ... -- this will *not* be exported 
exportedFunction a b = helper a b -- this *will* be exported 

Chỉ các số nhận dạng trong dấu ngoặc đơn thực sự sẽ được xuất; phần còn lại bị ẩn. Nếu bạn không bao gồm dấu ngoặc đơn, mọi thứ sẽ được xuất theo mặc định.

Lưu tệp này dưới dạng Blarg.hs.Bây giờ bạn có thể nhập nó trong Main:

import Blarg 

Một cách hữu ích để nhóm chức năng là where:

complicatedFunction a b c = helper 0 
    where helper count = ... 

Bằng cách này helper là chỉ trong phạm vi cho complicatedFunction và cũng có quyền truy cập vào a, bc từ complicatedFunction.

+0

Cảm ơn bạn đã trả lời. Tôi quen thuộc với chính, nhưng làm thế nào để tôi làm cho các chương trình con khác, và có các chương trình con đó giao tiếp và truyền các biến giữa chúng? –

+3

Bạn không thực sự có "chương trình con", bạn có * chức năng *. Vì không có đột biến, bạn chuyển các giá trị xung quanh làm đối số cho các hàm đó (như 'bổ sung 5 3' trong ví dụ của tôi). –

+0

Phải. Tôi muốn nói, làm thế nào để bạn thực hiện các "nhóm chức năng" khác? Về cơ bản, tôi đang cố gắng không để tất cả mọi thứ trong chính. –

Các vấn đề liên quan