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具有类型的记录。因此,要明确地将代码更改为"按类型"。

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

我正在使用可折叠的"折叠"。我不确定如何模式匹配一个空列表。如果可以的话,我会将签名更改为

is_min_pos :: Maybe Result -> Result -> Maybe Result

我现在得到错误

Cannot unify type
    Prim.Object
with type
    Data.Maybe.Maybe

这是可以理解的,因为在

foldl is_min_pos Nothing results

结果是类型列表结果is_min_pos期望可能结果

解决这个问题的干净方法是什么?

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访问者读取其position属性。

相关内容

  • 没有找到相关文章

最新更新