gpt4 book ai didi

haskell - 作为 Data.Map 值的异构类型

转载 作者:行者123 更新时间:2023-12-02 02:44:27 24 4
gpt4 key购买 nike

我希望能够做这样的事情,这显然是不允许的。

import qualified Data.Map as Map
x = Map.fromList [
("Name", ["John", "Steve", "Kelly", "Zoe"]),
("Surname", ["Smith", "Lee", "Ng", "White"]),
("Age", [1, 2, 3, 4])
]

一种可能的解决方案是创建这样的类型:
data L = LInt [Int] | LString [String]

x = Map.fromList [
("Name", LString ["John", "Steve", "Kelly", "Zoe"]),
("Surname", LString ["Smith", "Lee", "Ng", "White"]),
("Age", LInt [1, 2, 3, 4])
]

这是不可取的。有没有更好的方法?

我的实际用例:
从广义上讲,我正在尝试实现 dplyr ( http://cran.r-project.org/web/packages/dplyr/vignettes/introduction.html ) 的一部分,它可以被视为“数据语法”。 Dplyr 具有用于表格数据的列和行选择以及行的分组和连接的表达式,其中行数可以是数百万,列数可以是数百。我现在关心的不是数据大小,而是生成与该包类似的功能和工作流程的能力

最佳答案

您可以为此使用存在量化

{-# LANGUAGE ExistentialQuantification, FlexibleInstances, TypeSynonymInstances #-}

import qualified Data.Map as Map

class ColumnData c
instance ColumnData Integer
instance ColumnData String

data Column = forall c . ColumnData c => Column [c]

x = Map.fromList [
("Name", Column ["John", "Steve", "Kelly", "Zoe"]),
("Surname", Column ["Smith", "Lee", "Ng", "White"]),
("Age", Column [1::Integer, 2, 3, 4])
]

(请注意,我们需要在最后一列中使用显式类型注释,因为文字被重载,而存在性无法完全应对)。

现在当然映射数据的真实类型不能从 x 获得。 .你只有 forall a . a => Column a ,你唯一能做的就是调用 class Column 的方法。 .这个例子没有定义。您应该添加自己的方法,您必须明智地选择这些方法。

请注意,由于我不太明白的原因,许多铁杆 Haskellers 不赞成这种技术。如果有人能对此有所了解,那就太好了。

关于haskell - 作为 Data.Map 值的异构类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27368211/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com