Haskell新手在这里。
所以这里有一段代码如下:
function >>= \(x, y) -> return $ Int x y
[编辑]
为了提供更广泛的上下文,我试图实现一个简单的解析器 (1,2)作为参数并返回DataType a b作为结果:
parse = do
parseInt >>= \(x, y) -> return $ ComplexNum x y
parseInt函数如下所示:
parseInt = fmap read (many1 (satisfy isDigit))
编译代码时,出现以下错误:
Couldn't match expected type `Int' with actual type `(t0, t1)'
如何对元组中的元素进行类型转换/提取并将它们作为整数返回?
提前致谢!
答案 0 :(得分:1)
您真的需要在问题中提供更多详细信息。首先,“Int x y”仅在某处有一个名为“Int”的数据构造函数时才有效(这是非常不直观的,你不应该这样做)。其次,编译器抱怨你试图使用元组代替整数。 “投射”不是你通常在Haskell中可以做的事情。使用数字类型,您可以使用fromIntegral等函数在它们之间进行转换,但是当您需要Int - >等转换时整数,Int - >浮动等等与元组无关。从元组中提取值是使用模式匹配完成的,就像你的代码一样:\(x,y) - > ...将从作为参数传递给该lambda的2元组中提取x和y。
答案 1 :(得分:0)
假设你的函数有类似这样的类型:
function :: ... -> m (Int, Int)
并且您希望对函数在monad m中返回的两个int执行某些操作(其中m可能是IO或STM或其他),最简单的方法可能是使用模式匹配和do语句:
do
{- some stuff -}
(x, y) <- function {- args -}
return $ myFuncThatTakesTwoInts x y
然而,如果没有你希望用这两个类似Int的东西做的确切细节,就不可能给出确切的答案!
答案 2 :(得分:0)
您的parseInt看起来像使用parsec库或类似的东西。
如果是这种情况,parseInt只解析一个 Int。您需要使用它两次来解析两个Int。像
这样的东西parse = do
x <- parseInt
y <- parseInt
return $ ComplexNum x y
上面只是一个草图,因为写入它不会起作用,因为x将解析所有数字,并且没有留给y。我猜你写的是你要解析类似“(1,2)”的东西,所以你需要为逗号添加解析器(这将分隔数字)和括号。