Purescript - невозможно объединить тип
Я новичок в Purescript (как и в Haskell), и я застрял с ошибкой не может объединить. Изначально у меня было:
newtype Domain = Domain String
newtype Keyword = Keyword String
type Result = {
domain :: Domain,
occurred :: Boolean,
position :: Number,
quality :: Number
}
is_min_pos :: Maybe Result -> Maybe Result -> Maybe Result
is_min_pos Nothing Nothing = Nothing
is_min_pos Nothing y = y
is_min_pos x Nothing = x
is_min_pos x y = if y.position < x.position then y else x
Это давало мне ошибку
Cannot unify type
Prim.Object
with type
Data.Maybe.Maybe
Я предположил, что это потому, что он ожидал, что x и y будут иметь тип Maybe Record. Таким образом, чтобы быть явным, я изменил код на соответствие шаблону по типу.
data Result = Result {
domain :: Domain,
occurred :: Boolean,
position :: Number,
quality :: Number
}
is_min_pos (Result x) (Result y) = if y.position < x.position then y else x
Теперь я получаю ошибку
Cannot unify type
Data.Maybe.Maybe Processor.Result
with type
Processor.Result
И это относится к этому разделу
y.position < x.position -- in the first case
а во втором случае
Result x -- on the pattern matching side
Я работаю над этим дальше
type Results = List Result
get_item_with_min_position :: Results -> Maybe Result
--get_item_with_min_position [] = Nothing
get_item_with_min_position results = foldl is_min_pos Nothing results
Я использую 'foldl' от Foldable. Я не уверен, как шаблон соответствует пустому списку. Если бы я мог, я бы изменил тип подписи на
is_min_pos :: Maybe Result -> Result -> Maybe Result
Теперь я получаю ошибку
Cannot unify type
Prim.Object
with type
Data.Maybe.Maybe
Это понятно, потому что в
foldl is_min_pos Nothing results
результаты имеют тип List Result is_min_pos Ожидает Может быть Результат
Каков был бы чистый способ решить эту проблему?
1 ответ
Maybe
Тип имеет два конструктора данных: Nothing
, который вы правильно сопоставляете, и Just
, Если вы хотите соответствовать что-то типа Maybe a
который содержит значение, вы должны соответствовать Just
конструктор.
Вам необходимо изменить окончательный вариант следующим образом:
is_min_pos (Just x) (Just y) = if y.position < x.position
then Just y
else Just x
Вот, Just x
имеет тип Maybe Result
, что правильно в соответствии с типом подписи, и так x
имеет тип Result
так что вы можете использовать .position
Accessor, чтобы прочитать его position
имущество.