Haskell中的函数用于返回一对中的其他元素

时间:2013-12-18 23:28:31

标签: haskell tuples

Haskell中是否有一个函数会返回一对中的另一个成员,例如调用函数“other”:其他'D'('D','W')将返回'W'和其他'W' '('D','W')返回'D'?

2 个答案:

答案 0 :(得分:7)

“Haskell中有一个函数......”?

使用Hoogle,您可以很好地了解任何此类问题的答案。 Haskell的美妙之处在于,这种类型通常与您提出的功能完全不同,而Hoogle是一种可以让您获得非常全面的答案的工具。

在这种情况下,我们会得到一个元组,并希望得到元组中的一个值。

(a, b)->a->b  or (a, b)->b->a

但是等等! Haskell不能从同一个函数输出两个不同的类型,因此给出了一个隐式约束 - a必须与b相同。现在的类型是:

(a, a)->a->a

(这会进一步缩小功能搜索空间,使Hoogle更加有用)。

再次,等等......我们忘记了什么。类型a需要有一个(==)运算符才能进行测试....很棒,甚至还有一个缩小范围:

Eq a=>(a, a)->a->a

现在我们可以将其输入到Hoogle中,并且看到....几乎没什么用处。

这是失败吗?一点也不! Hoogle非常全面,而且在我之前的经历中,如果它不存在,它可能不是标准函数,所以自己写吧。

(我觉得这个函数不是标准的并不奇怪....元组很少用于传递相同类型的项的通用列表,这更像是列表中的东西)

答案 1 :(得分:1)

other :: Eq a => a -> (a, a) -> a
other x (y,z) | x == y = z | x == z = y | otherwise = error "undefined"

你可以这样做。注意,如果字符存在于元组值范围之外会发生什么?

test1 = other 'D' ('D','W') -- * W
test2 = other 'W' ('D','W') -- * D
test3 = other 'X' ('D','W') -- * error...

Per @ RottenBrain的建议。 Maybe monad可用于处理失败案例。

other :: Eq a => a -> (a, a) -> Maybe a 
other x (y,z) | x == y = Just z | x == z = Just y | otherwise = Nothing