Я думаю, что использование -Wall
может привести к менее читаемому коду. Особенно, если он занимается арифметикой.
Некоторые другие примеры, где использование -Wall
предполагает модификации с худшей читаемостью.
(^)
с -Wall
требуется тип подписей для показателей
Рассмотрим этот код:
norm2 x y = sqrt (x^2 + y^2)
main = print $ norm2 1 1
С -Wall
выдает два таких предупреждения:
rt.hs:1:18:
Warning: Defaulting the following constraint(s) to type `Integer'
`Integral t' arising from a use of `^' at rt.hs:2:18-20
In the first argument of `(+)', namely `x ^ 2'
In the first argument of `sqrt', namely `(x ^ 2 + y ^ 2)'
In the expression: sqrt (x ^ 2 + y ^ 2)
Писать (^(2::Int)
везде вместо (^2)
нехорошо.
Типовые подписи требуются для всех верхних уровней
При написании быстрого и грязного кода это раздражает. Для простого кода, где используется максимум один или два типа данных (например, я знаю, что я работаю только с Double
s), запись подписей типов везде может затруднить чтение. В приведенном выше примере есть два предупреждения только из-за отсутствия сигнатуры типа:
rt.hs:1:0:
Warning: Definition but no type signature for `norm2'
Inferred type: norm2 :: forall a. (Floating a) => a -> a -> a
...
rt.hs:2:15:
Warning: Defaulting the following constraint(s) to type `Double'
`Floating a' arising from a use of `norm2' at rt.hs:2:15-23
In the second argument of `($)', namely `norm2 1 1'
In the expression: print $ norm2 1 1
In the definition of `main': main = print $ norm2 1 1
В качестве отвлечения внимания одна из них относится к строке, отличной от той, где требуется подпись типа.
Необходимы подписи типа для промежуточных расчетов с Integral
Это общий случай первой проблемы. Рассмотрим пример:
stripe x = fromIntegral . round $ x - (fromIntegral (floor x))
main = mapM_ (print . stripe) [0,0.1..2.0]
Это дает кучу предупреждений. Везде с fromIntegral
для преобразования обратно в Double
:
rt2.hs:1:11:
Warning: Defaulting the following constraint(s) to type `Integer'
`Integral b' arising from a use of `fromIntegral' at rt2.hs:1:11-22
In the first argument of `(.)', namely `fromIntegral'
In the first argument of `($)', namely `fromIntegral . round'
In the expression:
fromIntegral . round $ x - (fromIntegral (floor x))
И все знают, как часто нужно fromIntegral
в Хаскеле ...
В большинстве подобных случаев числовой код может стать нечитаемым только для выполнения требований -Wall
. Но я все еще использую -Wall
в коде, в котором хотел бы быть уверен.