You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 15:49:56