2016-02-18 17 views
6

Tại sao tôi nhận được kết quả như dưới đây?F # List.length luôn trả về 1?

> List.length [1,2,3];; 
val it : int = 1 
> List.length [1,2,3,4];; 
val it : int = 1 

Tôi dự kiến ​​sẽ nhận được 3 và 4! Tôi có đang sử dụng chức năng gọi không chính xác không?

+0

Điều này đã được trả lời dưới đây, nhưng không cảm thấy xấu. Đây là một sai lầm thực sự phổ biến :) – TheQuickBrownFox

Trả lời

16

Nó không phải về chức năng - đó là cách bạn nhập các mục trong danh sách. Bạn sử dụng , thay vì ;!

> List.length [1,2,3];; 
val it : int = 1 
> List.length [1;2;3];; 
val it : int = 3 

lý do là [1,2,3] là danh sách của tuples chỉ với một mục:

> [1,2,3];; 
val it : (int * int * int) list = [(1, 2, 3)] 

các (..) nhìn thấy trong đầu ra - buồn bã bạn có thể nhập dữ liệu với các (..) và nhiều mùa thu cho nó

Nếu bạn sử dụng ; thay vào đó bạn nhận được danh sách ints với 3 yếu tố:

> [1;2;3];; 
val it : int list = [1; 2; 3] 
+1

Tại sao tùy chọn của dấu ngoặc đơn là một điều buồn? Không cần cho rằng boilerplate :-) Một khi danh sách được sử dụng cho một cái gì đó có ý nghĩa hơn, các loại sẽ ngăn chặn các lỗi như thế này. – CaringDev

+1

Đó là một điều IMO nhất quán và đó là một điều dễ đọc - khi bạn so sánh đầu vào '[1,2,3]' với '[(1,2,3)]' (như trong đầu ra) - đó là nhiều hơn thông thoáng? - Đây cũng là một sai lầm phổ biến xảy ra mọi lúc - đặc biệt nếu bạn biết một cái gì đó như Haskell, Javascript hoặc Python - tất cả đều sử dụng ',' ... – Carsten

+1

Khả năng đọc cũng là một chức năng của ngữ cảnh. Ở đây tôi * sẽ * đặt dấu ngoặc đơn. Ví dụ. trong các chữ ký chức năng, lấy các tệp có chú giải loại, nó có thể dễ đọc hơn để loại bỏ chúng (luôn ở đây và ở đó). Đối với các nhà phát triển mới '(1," a "): int * string', tức là', 'so với' * 'cũng gặp khó khăn lúc đầu. Nhưng IMO một ngôn ngữ nên được đánh giá trên những gì bạn * có thể * (ví dụ: DSL tốt) trước đường cong học tập ban đầu (do sự an toàn không bị xâm phạm). Giống như mọi công cụ khác, một công cụ cũng cần tìm hiểu cách không lạm dụng nó (ví dụ: các nhà khai thác bộ sưu tập Scala). Làm tê liệt sức mạnh vì điều này sẽ rất buồn. – CaringDev