gpt4 book ai didi

function - 如何仅将任一侧作为参数传递 Haskell

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

我的一个函数返回:

parse :: Int -> String -> Either String JsonLikeValue
和其他需要 JsonLikeValue作为参数:
convert :: Int -> JsonLikeValue -> Either InvalidState To
JsonLikeValue是自定义数据类型:
data JsonLikeValue = JLString String | JLInt Int | JLArray [JsonLikeValue] deriving (Show, Eq)
当我打电话时:
convert num (parse size message)
它给出了以下内容:
Couldn't match expected type ‘JsonLikeValue’
with actual type ‘Either String JsonLikeValue’
如何避免这种情况并且只有右侧作为参数传递?
提前致谢 :)
编辑:标记为答案的解决方案非常有用,因为它考虑了所有可能的结果,而且由于我不是专家,但看起来更专业,因此查看它非常重要。
但足以解决所需提取的是:
extractValue :: Either String JsonLikeValue -> JsonLikeValue
extractValue a = case a of
Left e -> JLArray []
Right r -> r
Right 的情况下它只返回值,如果是 Left它返回一些必需的数据类型。请注意,这仅在您 100% 确定该参数将返回 Right 时才有效。值(value)。否则,请检查下面的答案。
评论中的另一个好消息是使用 fromRight来自 Data.Either

最佳答案

第一个问题是我们需要返回一些东西以防parse值返回 Left …值(value)。例如,我们可以制作一个将两个“错误”结合在一起的函数:

myfunction :: Int -> Int -> String -> Either (Either String InvalidState) To
myfunction = …
我们可以利用模式匹配来解包 Right 的情况下的值。然后使用 convert功能,如:
myfunction :: Int -> Int -> String -> Either (Either String InvalidState) To
myfunction size num message = go (parse size message)
where go (Left e) = Left (Left e)
go (Right jlv) = pp (convert num jlv)
pp (Left e) = Left (Right e)
pp (Right r) = Right r
这里 go因此检查 parse size message 的结果值,如果它是 Left e , 我们返回 Left (Left e) .如果是 Right jlv (用 jlv 包裹在其中的 JsonLikeValue),我们因此称 convert num jlv .
我们仍然需要使用 pp 对结果进行后处理功能。 convert num jlv将有类型 Either InvalidState To ,我们需要将其转换为 Either (Either String InvalidState) To .我们通过转换 Left e 来做到这一点。到 Left (Right e) , 和 Right rRight r .请注意 Right正文中是 Either (Either String InvalidState) To 的数据构造函数类型,而 Right头部是 Either InvalidState To 的数据构造函数,所以两者并不相同。

关于function - 如何仅将任一侧作为参数传递 Haskell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64416138/

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