首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Haskell -异构数组?

Haskell -异构数组?
EN

Stack Overflow用户
提问于 2017-09-23 06:05:58
回答 3查看 368关注 0票数 2

我试着用99个haskell问题来学习Haskell:

Problems。对于其中一个问题,我必须返回一个异构的Element数组和表单(Int, Element)的元组。由于haskell不允许在数组中存储异构数据,所以我能想到的最好方法是

代码语言:javascript
运行
复制
data Hetero a = Tuple (Int, a) | Elem a deriving (Show, Ord, Eq)

然后将我的函数写成:

代码语言:javascript
运行
复制
myFunk [a] -> [Hetero a] 

-- Rest of the function

但我的结果如下:

代码语言:javascript
运行
复制
[Tuple (2, 10), Elem 1]

是否可以修改数据类型或函数以返回以下内容

代码语言:javascript
运行
复制
[(2, 10), 1] 
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-09-23 08:07:29

不,没有办法这样做。你已经做的是最好和最惯用的解决方案。

票数 4
EN

Stack Overflow用户

发布于 2017-09-23 09:34:46

如前所述,显式标记每个元素的类型是正确的。当您真正想要使用该列表时,这是值得的,因为您可以简单地对元素进行模式匹配,然后在每个子句中知道您有哪些类型!

但是,这并不意味着这样的列表必须总是用那些冗长的构造函数名称写出。您可以通过选择不同的构造函数名(特别是infix构造函数)来保存大量样板。

代码语言:javascript
运行
复制
data Hetero a = Int :* a | Elem a

那么你的名单就像

代码语言:javascript
运行
复制
[2 :* 10, Elem 1]

您甚至可以允许通过实例使用单数文本来定义这些值。

代码语言:javascript
运行
复制
instance (Num a) => Num (Hetero a) where
  fromIntegral = Elem . fromIntegral

然后...which允许写

代码语言:javascript
运行
复制
[2:*10, 1]

然而,这可能不是一个好主意,因为Num类型也应该支持加法、乘法等,我不确定对于元组情况是否能合理地定义。如果你走那条路,你应该确保算术运算的行为是正确的。

票数 3
EN

Stack Overflow用户

发布于 2017-09-23 10:43:31

但我的结果如下:

(我强调)

您可以通过更改Hetero的定义来解决这个问题。

代码语言:javascript
运行
复制
data Hetero a = Tuple (Int, a) | Elem a deriving (Ord, Eq)

instance Show a => Show (Hetero a) where
  show (Tuple (i, x)) = "(" ++ show i ++ ", " ++ show x ++ ")"
  show (Elem x) = show x

现在,Hetero元素的列表将看起来像您希望它看到的那样:

代码语言:javascript
运行
复制
*Q46376603> [Tuple (2, 10), Elem 1]
[(2, 10),1]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46376603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档