Haskell函数实现疑问:如何用fst和snd构造指定元组返回值
Haskell函数签名解析与正确实现
先搞懂函数签名的含义
f :: (a, b) -> (c, d) -> ((b, d), (a, c)) 这个签名的意思很明确:
- 它接收两个独立的元组作为参数:
第一个元组是(a, b)(第一个元素类型为a,第二个为b)
第二个元组是(c, d)(第一个元素类型为c,第二个为d) - 返回的是一个嵌套元组:外层是一个二元组,第一个内层元组是
(b, d)(取第一个输入元组的第二个元素 + 第二个输入元组的第二个元素),第二个内层元组是(a, c)(取第一个输入元组的第一个元素 + 第二个输入元组的第一个元素)
你的代码报错原因
你写的f x y = (,) ((,) snd x snd y) ((,) fst x fst y)问题出在:
你把snd、fst这些函数本身传给了(,)构造器,而不是先调用它们获取元组里的具体值。比如snd x才是取x的第二个元素,而你直接写snd,编译器会认为你要把函数作为元组元素,类型完全不匹配,自然报错。
正确实现方式
最直观易懂的写法直接构造目标元组即可:
f :: (a, b) -> (c, d) -> ((b, d), (a, c)) f x y = ((snd x, snd y), (fst x, fst y))
如果想用(,)显式构造(和你原来的思路对齐),需要先调用fst/snd拿到值再传:
f x y = (,) ((,) (snd x) (snd y)) ((,) (fst x) (fst y))
但显然第一种写法更简洁易读,新手优先用这种。
内容的提问来源于stack exchange,提问作者mabubmabub
相关产品推荐
相关产品推荐

