【问题标题】:List of Pairs of Chars in Haskell?Haskell中的字符对列表?
【发布时间】:2013-11-14 21:45:24
【问题描述】:

Haskell 中是否有一个函数,如果你提供了一个 Char 和一个 13 对字符的列表(所有不同的,即字母表中的每个字母都使用一次且仅一次),它会返回你配对的 Char使用您输入的字符,即如果我输入以下内容:

pairedChar Q [(A,Z),(B,Y),(C,X),(D,W),(E,V),(F,U),(G,T),(H ,S),(I,R),(J,Q),(K,P),(L,O),(M,N)]

我希望它返回 J?

如果没有这样的功能,我想也许可以通过 unzip 来获得一对列表,但不确定在获得列表后如何处理这些列表?

【问题讨论】:

  • 你不应该解压缩,你可以向下(使用模式匹配((x,y):ss)这个列表作为对并检查对中的任何一个成员是否是输入如果它是返回另一个。
  • 只记得,Char 是's',所以你的代码必须看起来像pairedChar 'Q' [('A','Z'),('B','Y'),...
  • hoogle 擅长回答“有没有做 X 的函数”形式的问题;只需在搜索框中输入您的类型签名。还要考虑你是否真的想要Map

标签: haskell char tuples


【解决方案1】:

查找函数执行此操作;不仅适用于您描述的那种对,而且适用于任何二元素元组列表。顺便说一下,这样的元组列表称为关联列表。

它返回一个 Maybe,因为可能没有匹配。

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

looks up a key in an association list

【讨论】:

  • 它不能以其他方式工作吗?如果我使用 A、B、C 等,即这对中的第一个字符,它可以正常工作,但使用 Q 它返回 Nothing?
  • 啊,你想匹配任何一个元素吗?不,没有标准库函数可以做到这一点。如果列表更长并且 ['Q','I'] 出现在列表的后面,您想返回什么?
【解决方案2】:

此答案建立在itsbruce 的答案的基础上,仍然使用lookup,但还首先按摩输入列表以包含每对两次,每次元素排序一次。

假设您的列表名为pairs

pairs :: [(Char, Char)]
pairs = [('A', 'Z'), ('B', 'Y'), ..., ('M', 'N')]

那么你需要做的就是复制每一对并交换元素:

import Data.Tuple (swap)

allPairs :: [(Char, Char)]
allPairs = pairs ++ map swap pairs

-- allPairs = [('A', 'Z') ... ('M', 'N'), ('Z', 'A'), ... ('N', 'M')]

... 其中swap 是来自Data.Tuple 的函数,它获取元组的两个元素并交换它们。它是这样定义的:

swap :: (a, b) -> (b, a)
swap (x, y) = (y, x)

现在您可以在allPairs 列表中创建lookup

pairedChar :: Char -> Maybe Char
pairedChar c = lookup c allPairs

如果您希望每个重复对在列表中彼此相邻,那么您也可以这样写allPairs

allPairs = do
    (x, y) <- pairs
    [(x, y), (y, x)]

现在它将包含这个顺序:

allPairs = [('A', Z'), ('Z', 'A'), ('B', 'Y'), ('Y', 'B') ... ('M', 'N'), ('N', 'M')]

【讨论】:

    【解决方案3】:

    你可以列一个更长的列表。

    字母 = "ABCDEFGHIJKLMNOPQRTSUVXYZ" 对 = zip 字母(反向字母) theOtherChar k = 查找 k 对——现在为您完成这项工作。

    【讨论】:

      猜你喜欢
      • 2021-09-19
      • 1970-01-01
      • 2011-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多