在Haskell中返回元组的元素

时间:2013-11-08 09:40:47

标签: haskell functional-programming tuples

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)'

如何对元组中的元素进行类型转换/提取并将它们作为整数返回?

提前致谢!

3 个答案:

答案 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)”的东西,所以你需要为逗号添加解析器(这将分隔数字)和括号。