Tôi sẽ nhận ý kiến của Yegge (và Ola Bini) về cách gõ tĩnh với một hạt muối. Nếu bạn đánh giá cao tính năng nhập tĩnh sẽ cung cấp cho bạn, bạn sẽ tìm hiểu cách hệ thống loại ngôn ngữ lập trình bạn chọn hoạt động.
IIRC, ML sử dụng cú pháp '*' cho bộ dữ liệu. < type> * < type> là một loại bộ tuple có hai phần tử. Vì vậy, (1, 2) sẽ có int * int loại.
Cả sử dụng Haskell và ML -> cho chức năng. Trong ML, int * int -> int sẽ là kiểu hàm nhận một bộ int và int và ánh xạ nó thành một int.
Một trong những lý do khiến bạn có thể thấy lỗi có vẻ mơ hồ giống như ngôn ngữ được sử dụng trong ngôn ngữ khác. với một hàm lấy hai tham số.
Vấn đề là, các ngôn ngữ chức năng thường mô hình hóa các hàm của nhiều tham số như hàm trả về hàm; tất cả các hàm chỉ nhận một đối số duy nhất. Nếu hàm này lấy hai đối số, nó thay thế một đối số và trả về một hàm của một đối số duy nhất, trả về kết quả cuối cùng, v.v. Để làm cho tất cả điều này dễ đọc, ứng dụng chức năng được thực hiện đơn giản bằng cách kết hợp (tức là đặt các biểu thức bên cạnh nhau).
Vì vậy, một chức năng đơn giản trong ML (lưu ý: Tôi đang sử dụng F # như ML của tôi) có thể trông hơi giống:
let f x y = x + y;;
Nó có kiểu:
val f : int -> int -> int
(Một chức năng lấy một số nguyên và trả về một hàm mà chính nó lấy một số nguyên và trả về một số nguyên.)
Tuy nhiên, nếu bạn ngây thơ gọi nó bằng một bộ:
f(1, 2)
... bạn sẽ gặp lỗi, vì bạn đã chuyển int * int vào nội dung mong đợi một int.
Tôi hy vọng rằng đây là "vấn đề" Ola đã cố gắng bỏ nguyện vọng tại. Tôi không nghĩ rằng vấn đề là xấu như ông nghĩ, mặc dù; chắc chắn, nó còn tồi tệ hơn trong các mẫu C++.
Tôi sẽ xây dựng mạnh mẽ hơn nhiều (muối shaker!) ... câu trả lời hay. –
cảm ơn - đó có lẽ là chính xác những gì tôi đã làm tất cả những năm trước đây như ngôn ngữ đầu tiên của tôi đã thực sự Pascal và C! – devstopfix
Vì vậy, báo giá trong câu hỏi là "chữ ký dự kiến Int * Int-> Int nhưng có Int-> Int-> Int"? Bởi vì tôi không thấy các loại giống hệt nhau là một lỗi. –