我试着用99个haskell问题来学习Haskell:
Problems。对于其中一个问题,我必须返回一个异构的Element
数组和表单(Int, Element)
的元组。由于haskell不允许在数组中存储异构数据,所以我能想到的最好方法是
data Hetero a = Tuple (Int, a) | Elem a deriving (Show, Ord, Eq)
然后将我的函数写成:
myFunk [a] -> [Hetero a]
-- Rest of the function
但我的结果如下:
[Tuple (2, 10), Elem 1]
是否可以修改数据类型或函数以返回以下内容
[(2, 10), 1]
发布于 2017-09-23 08:07:29
不,没有办法这样做。你已经做的是最好和最惯用的解决方案。
发布于 2017-09-23 09:34:46
如前所述,显式标记每个元素的类型是正确的。当您真正想要使用该列表时,这是值得的,因为您可以简单地对元素进行模式匹配,然后在每个子句中知道您有哪些类型!
但是,这并不意味着这样的列表必须总是用那些冗长的构造函数名称写出。您可以通过选择不同的构造函数名(特别是infix构造函数)来保存大量样板。
data Hetero a = Int :* a | Elem a
那么你的名单就像
[2 :* 10, Elem 1]
您甚至可以允许通过实例使用单数文本来定义这些值。
instance (Num a) => Num (Hetero a) where
fromIntegral = Elem . fromIntegral
然后...which允许写
[2:*10, 1]
然而,这可能不是一个好主意,因为Num
类型也应该支持加法、乘法等,我不确定对于元组情况是否能合理地定义。如果你走那条路,你应该确保算术运算的行为是正确的。
发布于 2017-09-23 10:43:31
但我的结果如下:
(我强调)
您可以通过更改Hetero
的定义来解决这个问题。
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
元素的列表将看起来像您希望它看到的那样:
*Q46376603> [Tuple (2, 10), Elem 1]
[(2, 10),1]
https://stackoverflow.com/questions/46376603
复制相似问题