gpt4 book ai didi

Purescript - 无法统一类型

转载 作者:行者123 更新时间:2023-12-04 00:00:19 26 4
gpt4 key购买 nike

我是 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 期望可能的结果

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

最佳答案

Maybe 类型有两个数据构造函数:Nothing(您正确匹配)和Just。如果你想匹配 Maybe a 类型的东西 does 包含一个值,你应该匹配 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 - 无法统一类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30031425/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com