haskell - 如何制作一个基本上只在 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 类型的键/值,其他任何东西都是额外的。
非常感谢任何帮助
解决方案
更新:它必须存储在一个列表中,将键和值包装成一个可能是一种选择
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
推荐阅读
- android - Flutter:尝试在 AppCenter 中构建时出现 appcenter:verifyReleaseResources 错误
- c# - 如何在文件夹中找到所有可编写脚本的对象,然后从其中加载一个变量?
- c# - 第一次请求后检测到 ChromeDriver
- laravel - Laravel 中的广播和 websocket 问题
- pandas - 使用熊猫列颜色设置颜色
- proxy - 测试带有客户端错误的 Grafana 仪表板:407
- swift - Swift:上传到服务器时加密文件内容并打开它
- python - pyqtgraph鼠标交互:使用鼠标右键或中键缩放到选中框
- android - 有没有办法从Android图像中提取自动标签
- reactjs - 不能改变背景颜色