Purescript - 无法统一类型
Purescript - Cannot unify type
我是 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
结果是列表结果类型
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
属性.
我是 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
结果是列表结果类型 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
属性.