2015-07-09 12 views
6

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.

Trả lời

2

Có vẻ như đó là lỗi Dialyzer. Gọi số :lists.all/2 (với các đối số hoán đổi) tạo ra cảnh báo chính xác nhưng vì một số lý do gọi hàm all?/2 cục bộ của bạn với cùng một thông số không.

+0

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

+0

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. –

+0

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

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