Map
— это параметризованный тип данных (также называемый абстрактным типом данных). Только когда вы указываете тип для ключей и тип для значений, вы получаете полностью определенный тип.
Например, карта, которая позволяет искать String
s по Integer
s, имеет тип Map Integer String
.
Кроме того, кажется, что вы импортировали карту с квалификацией (как и должно быть). Из-за этого вы должны использовать Map.Map
вместо Map
в подписи.
Таким образом, ваша функция должна иметь сигнатуру типа
serialExpansion :: Int -> Map.Map Key Value
где Key
— тип данных ключа, а Value
— тип данных значения. В вашем случае, если я должен предположить, возможно, вы хотите Int
для обоих Key
и Value
. Чтобы быть точным: вы хотите, чтобы Key
совпадало с типом элементов в списке listOfSimpleDividers num
, а Value
совпадало с типом элементов в списке powers num
. (Может помочь проверить сигнатуру типа Map.fromList
, если это неясно).
К настоящему моменту вы, возможно, спросите: «Но если вы могли указать правильный тип возвращаемого значения serialExpansion
, почему не может этого сделать компилятор?» Может. Именно поэтому ваш первый пример сработал. Поскольку вы пропустили сигнатуру типа, компилятор вывел ее из контекста. Как вы только что убедились, написание подписей типов может быть хорошим способом убедиться, что вы полностью понимаете свой код (вместо того, чтобы полагаться на вывод типов).
person
gspr
schedule
06.12.2010