首页 > 解决方案 > 如何制作一个基本上只在 Haskell 中存储列表的数据结构

问题描述

我已经编写了几个对存储在同一个列表中的键和值的列表进行操作的函数,例如, myList = [k1, v1, k2, v2]但不是对列表进行操作,我需要创建我自己的称为 Translator 的数据结构以供我的函数操作。

这是其中一个功能,它只是检查一个键是否在列表中。(我是 Haskell 的初学者,不允许使用我自己没有编写的任何函数,所以我知道这个函数可能有很大的改进空间,但这不是我想要的)

hasTranslation _ [] = False
hasTranslation k l = hasTranslation' k l 0
hasTranslation' k l@(x:xs) n
                         | n `mod` 2 == 1 && xs == [] = False
                         | n `mod` 2 == 1 = hasTranslation' k xs (n+1)
                         | k == x = True
                         | otherwise = hasTranslation' k xs (n+1)

我需要创建一个数据结构,以列表类型格式存储相同类型的键和值,然后修改我的函数来做到这一点。

我已经尝试了几种组合,type Translator a = [a]data Translator = IntTranslator [Int] deriving (Show, Eq)我无法理解如何将这些组合应用于我需要它们的工作方式。

我应该注意,我的数据结构需要适用于 Int 和 String 类型的键/值,其他任何东西都是额外的。

非常感谢任何帮助

标签: haskell

解决方案


更新:它必须存储在一个列表中,将键和值包装成一个可能是一种选择

data KV k v = K k | V v deriving Show -- or use Either
type KVList k v = [KV k v]

hasTranslation :: (Eq k) => k -> KVList k v -> Bool
hasTranslation _ [] = False
hasTranslation k ((V _) : xs) = hasTranslation k xs
hasTranslation k ((K k') : xs)
  | k == k' = True
  | otherwise = hasTranslation k xs

:可能是直接翻译[(k, v)]

type KVList k v = [(k, v)]

hasTranslation :: (Eq k) => k -> KVList k v -> Bool
hasTranslation _ [] = False
hasTranslation k ((k', _) : xs)
  | k == k'   = True
  | otherwise = hasTranslation k xs

推荐阅读