Function 如何将其中一个作为参数Haskell传递
我的其中一个函数返回:Function 如何将其中一个作为参数Haskell传递,function,haskell,parameter-passing,either,Function,Haskell,Parameter Passing,Either,我的其中一个函数返回: parse :: Int -> String -> Either String JsonLikeValue 而其他则将JsonLikeValue作为参数: convert :: Int -> JsonLikeValue -> Either InvalidState To JsonLikeValue是自定义数据类型: data JsonLikeValue = JLString String | JLInt Int | JLArray [JsonL
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
其中,在右侧
的情况下,它只返回值,在左侧
的情况下,它返回所需数据类型的内容。请注意,只有当您100%确定参数将返回Right
值时,这才有效。否则,请检查下面的答案
注释中的另一个好注意事项是使用
from right
from数据。或者第一个问题是,如果parse
值返回Left…
值,我们需要返回一些内容。例如,我们可以制作一个函数,将两个“错误”与:
这里go
检查parse size消息的结果
值,如果是Left e
,则返回Left(Left e)
。如果它是一个右jlv
(其中包含jlv
包装的JsonLikeValue
),则我们称之为convert num jlv
我们仍然需要使用pp
函数对结果进行后处理。convert num jlv
将具有类型或InvalidState To
,我们需要将其转换为或(或字符串InvalidState)To
。我们通过将左e
转换为左(右e)
,将右r
转换为右r
来实现这一点。请注意,正文中的右侧
是或(或字符串InvalidState)至
类型的数据构造函数,而头部中的右侧
是或InvalidState至
类型的数据构造函数,所以这两个不一样。如果parse size message
返回一个Left…
,您希望返回什么。只有当parse size message
返回right时,才应该调用它,因此在我的情况下返回Left
值时发生什么并不重要。任何可能的情况都适合我,即使是简单的“error”string
问题是表达式应该返回什么。像convert num(parse size message)
这样的表达式的结果应该是什么。如果parse
返回Left“Foo”
,它不能返回或InvalidState
,因为或InvalidState
不是字符串
。那么输出可以类似于或(或字符串InvalidState)JsonLikeValue
,因此我们使用或
来表示“错误”`区分这两个错误。如果确定在返回Right…
时调用了parse
,则可以使用fromRight
fom数据。或者
,将函数更改为convert num。fromRight$(解析大小消息)
myfunction :: Int -> Int -> String -> Either (Either String InvalidState) To
myfunction = …
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