Haskell中是否有一个函数会返回一对中的另一个成员,例如调用函数“other”:其他'D'('D','W')将返回'W'和其他'W' '('D','W')返回'D'?
答案 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