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