"learn you some erlang" adlı çevrimiçi kitapla ilgileniyorum ve anlayışımı kontrol etmek için bazı alıştırmalar yapmaya çalışıyorum. Dialyzer, bu eğlenceli sözleşmenin üst üste binen alanlara sahip olduğunu neden söylüyor?
I (tüm unsurları aynı tip T olması gereken bir fifo) bir "typed_fifo (T)" tanımlamaya çalışırken, bölüm Tip Özellikleri ve Erlang yılında, FIFO örnek de değişiklik yapılmıştipim şartname şunlardır:
-spec empty (typed_empty_fifo()) -> true;
(typed_nonempty_fifo(_)) -> false.
empty({fifo, [], []}) -> true;
empty({fifo, A, B}) when is_list(A), is_list(B) -> false.
dialyze:
-type typed_empty_fifo() :: {fifo, [], []}.
-type typed_nonempty_fifo(A) :: {fifo, nonempty_list(A), list(A)} | {fifo, [],nonempty_list(A) }.
-type typed_fifo(A) :: typed_empty_fifo() | typed_nonempty_fifo(A).
ve aşağıdaki fonksiyon spec kullanıldığında bir r, örtüşen alan nedeniyle belirtimi göz ardı edeceğini söyler.
Birisi bana hata yaptığımı söyleyebilir mi?
Yazılmış bir fifo tanımlamaya çalışmadan önce başka bir noktaya sahibim Güzel bir şekilde çalışan bir versiyonum vardı, Bir Dialyzer bana uygun olmayan listelerin kullanımını engelleyecek hiçbir şey olmadığını gösteriyor. Sürpriz bir şekilde, bir listenin doğru/yanlış karakterini test etmek için basit bir yol (bir gardiyanda kullanabileceğim) bulamıyorum.
Bu gerçekten garip, çünkü bif uzunluk/1 kullandığımda, badarg nedeni ile başarısız olabilir!
23> L=[1,2|3]. ==> [1,2|3]
24> is_list(L). ==> true
25> length(L). ==> exception error: bad argument
in function length/1 called as length([1,2|3])
Teşekkür
Teşekkür ederim Aronis. Bence Dialyzer'in vermeyi amaçladığı şeyden daha fazlasını istiyorum. Bu spesifikasyonları kullanmanın yararının ne olabileceğini, diyalizcinin ne yapabildiğini ve benim için gayretin ne olduğunu anlamaya çalışıyorum. En azından bu sorunu uygunsuz bir liste ile keşfettim. Bu arada, hala ikinci soruma bir çözüm arıyorum. Ben eğlenceli bir test gibi beklemek var: is_list (X) andalso uzunluğu (X)> -1 çalışır. Ama bir işlevin içine çöker. – Pascal
Cevabı olası bir çözümle düzenledim. Oh ve benim ilk adım Stavros! :-) – aronisstav