【问题标题】:List of Tuples as a function Parameter in Haskell元组列表作为 Haskell 中的函数参数
【发布时间】:2015-01-05 08:20:30
【问题描述】:

如何定义一个参数是元组列表的函数?所以输入的一个例子是

[("hey", False), ("you", True)]

我的函数将元组列表设为:[(String, Bool)] 所以这就是它的样子:

aFunc :: [(String, Bool)] -> Bool
aFunc ???? = 

那么我应该填写什么????能够访问我的元组?任何帮助都会很棒。谢谢。

编辑:

aFunc :: [(String, Bool)] -> Bool
aFunc aTuple = mapM_ lookup aTuple?

那么我如何在函数中访问我的元组?那是行不通的。

【问题讨论】:

  • 这个问题太模糊了。你想实现什么功能?
  • 我只是想了解如何访问我的元组。所以通常我会做类似的事情; aFunc :: String -> Bool -> Bool aFunc stringInput aBool = case aBool of... 我在问我会在 ????而不是 stringInput 或 aBool 用于访问元组列表中的项目。
  • 元组列表没有什么特别之处 - 您必须将参数视为一个列表,其项目是元组 :) 我需要更多信息以获得更具体的答案.
  • 您是否尝试实现一个函数,该函数接受一个字符串(即"Hey")并从列表中返回一个匹配的布尔值?

标签: list function haskell parameters tuples


【解决方案1】:

您似乎正在尝试实现自己的lookup 版本。您可以使用列表推导编写一个简单的版本:

lookup' :: String -> [(String,Bool)] -> Bool
lookup' k lkp = head $ [v | (k',v) <- lkp, k'==k]

或者使用filter:

lookup'' :: String -> [(String,Bool)] -> Bool
lookup'' k lkp = snd $ head $ filter ((==k) . fst) lkp

请注意,这些版本是不安全的 - 也就是说,如果列表不包含您的项目,它们将失败并出现丑陋且无信息的错误:

ghci> lookup' "foo" [("bar",True)]
*** Exception: Prelude.head: empty list

您可以通过编写自己的自定义错误消息来解决此问题:

lookupErr :: String -> [(String,Bool)] -> Bool
lookupErr k lkp = case [v | (k',v) <- lkp, k'==k] of
                     (v:_) -> v
                     [] -> error "Key not found!"

更好的方法是返回Maybe Bool

lookupMaybe :: String -> [(String,Bool)] -> Maybe Bool
lookupMaybe k lkp = case [v | (k',v) <- lkp, k'==k] of
                     (v:_) -> Just v
                     [] -> Nothing

库版本采用这种方法,并且具有更通用的签名:

lookup :: (Eq a) => a -> [(a,b)] -> Maybe b

你可以阅读它的实现here

【讨论】:

  • 这实际上是我一直在寻找的,但我试图自己去那里。谢谢。我真的很感激。
  • 很高兴为您提供帮助,如果我的回答过于具体,我们深表歉意。阅读Data.List source code 是学习 Haskell 基础知识的好方法。它包含许多以优雅方式实现的简单函数,是培养 Haskell 良好习惯的重要来源:)
猜你喜欢
  • 1970-01-01
  • 2019-09-08
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-23
相关资源
最近更新 更多