【问题标题】:Purescript - Cannot unify typePurescript - 无法统一类型
【发布时间】:2015-07-13 21:57:55
【问题描述】:

我是 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

我正在使用 Foldable 中的“foldl”。我不确定如何对空列表进行模式匹配。如果可以,我会将类型签名更改为

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

我现在得到错误

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

这是可以理解的,因为在

foldl is_min_pos Nothing results

results 是 List Result 类型 is_min_pos 期望可能的结果

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

【问题讨论】:

    标签: purescript unify


    【解决方案1】:

    Maybe 类型有两个数据构造函数:Nothing,您正确匹配,Just。如果你想匹配Maybe a 类型的东西确实 包含一个值,你应该匹配Just 构造函数。

    你需要修改final case如下:

    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属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-11
      • 1970-01-01
      • 1970-01-01
      • 2016-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多