Trong quá trình học Elixir, tôi đang chơi với Dialyzer để đặt các loại chức năng của mình. Về vấn đề này, tôi đã nhận thấy rằng Dialyzer dường như không kiểm tra các loại cho các chức năng ẩn danh.Dialyzer có phân tích các chức năng ẩn danh không?
Trong ví dụ bên dưới, tôi chuyển một hàm ẩn danh có thêm hai số và trả về một số (t::number -> number)
, vào hàm all?
. Do đó tôi không trả lại boolean như đã hứa trong thông số all?
spec (t::any -> boolean)
.
defmodule Exercises do
@spec all?([t::any], (t::any -> boolean)) :: boolean
def all?([], _), do: true
def all?([h|t], con) do
if con.(h) do
all?(t,con)
else
false
end
end
@spec funski() :: boolean
def funski() do
all?([1,1,2], &(&1 + 1))
end
end
Dialyzer dường như không báo cáo bất kỳ lỗi hoặc cảnh báo cho mã này, và tôi curios nếu lọc là điều không thể kiểm tra loại sai lầm hoặc nếu tôi đang làm gì đó sai.
hoán đổi các đối số của 'tất cả?/2' làm cho năng suất Dialyzer sau cảnh báo 'Cuộc gọi' Elixir.Exercises ':' tất cả? '(Vui (())> số()), [1 | 2 ,. ..]) sẽ không bao giờ trở lại kể từ khi gõ thành công là (may_improper_list(), any()) -> boolean() ... '. Nhưng tôi không thấy cách liên quan đến phân tích hàm ẩn danh '& (& 1 + 1)' – Michelrandahl
Tôi có nghĩa là khi gọi ': lists.all/2' (một hàm hoàn toàn khác), bạn nên hoán đổi các đối số. Và khi gọi hàm đó, bạn sẽ nhận được cảnh báo chính xác. Vì vậy, nó có vẻ là một lỗi trong dialyzer mà không nhận được cảnh báo cho chức năng của bạn. –
xin lỗi, tôi đã bỏ lỡ câu trả lời của bạn. Tuy nhiên, ': list.all (& (& 1 + 1), [1,1,2])' không làm cho Dialyzer mang lại bất kỳ cảnh báo nào khi tôi thêm nó thay vì 'tất cả? ([1,1,2] . & (& 1 + 1)) '.. Có lẽ nó có liên quan đến mã' .beam' được tạo ra bởi trình biên dịch elixir mà tôi đang cho Dialyzer với ... – Michelrandahl