如何解决如何仅将任一参数的一侧作为参数传递给Haskell
我的其中一个函数返回了其中一个:
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
值时才有效。否则,请检查下面的答案。
评论中的另一个不错的注意事项是使用fromRight
中的Data.Either
解决方法
第一个问题是,如果when( size($"grade_list") === n,).otherwise()
值返回parse
值,我们需要返回某些内容。例如,我们可以创建一个将两个“错误”与以下内容组合在一起的函数:
Left …
在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 r
。请注意,主体中的Right r
是Right
类型的数据构造函数,而头部的Either (Either String InvalidState) To
是Right
的数据构造函数,所以两者是不一样。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。