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 имущество.

Другие вопросы по тегам