【问题标题】:Having trouble getting the first value from a Haskell Tuple从 Haskell 元组中获取第一个值时遇到问题
【发布时间】:2023-03-22 04:33:02
【问题描述】:

我有一个([(Int, Int, Int)], Int, Int) 形式的值

我需要一个以([(Int, Int, Int)], Int, Int) 形式获取数据并返回[[(Int, Int, Int)]] 的函数

假设我的列表名为it。 当我运行fst it

我收到此错误

 * Couldn't match expected type `(a, b0)'
                  with actual type `([(Int, Int, Int)], Int, Int)'
    * In the first argument of `fst', namely `it'
      In the expression: fst it
      In an equation for `it': it = fst it
    * Relevant bindings include it :: a (bound at <interactive>:9:1)

我无法理解我做错了什么。有人可以帮我吗。我想获取it 的第一个值,它是一个列表。

【问题讨论】:

    标签: haskell functional-programming


    【解决方案1】:

    就像签名指定的那样,fst :: (a, b) -&gt; a 返回 2-tuple 的 first 项。所以不是三元组(或任何 n 元组 n ≠ 2)。

    对于 3 元组(及更高),通常使用模式匹配(例如在 lambda 表达式中)。例如:

    \(x, _, _) -> x
    

    是一个 lambda 表达式,用于获取 3 元组的第一项。

    或者您可以定义一个执行此模式匹配的函数,例如:

    fst3 :: (a, b, c) -> a
    fst3 (x, _, _) = x
    

    【讨论】:

    • 如果要求有一个函数foo:: ([(Int, Int, Int)], Int, Int) -&gt; [[(Int, Int, Int)]],你提供的方法是否仍然正确?
    • @user1692517:这是实现该功能的开始,但是类型本身并没有多大意义,因为您将它两次包装在一个列表中?此外,您还需要做一些映射。
    • Nvm 我想出了如何保持相同的函数类型。非常感谢,
    • @user1692517:如果你想复制东西,这是提取第一项的部分是的。你接下来要做的当然是另一个问题/方面:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    相关资源
    最近更新 更多