haskell - 带有列表的 Show 的新实例声明
问题描述
我对haskell相当陌生,我的任务是为我定义的数据类型为Show定义一个新的实例声明,但我很挣扎。我一直在这里搜索已经回答的问题,但我没有得到任何结果,我创建了一个帐户只是为了解决这个问题,这太令人沮丧了。
想象一下,我已经声明了两种这样的新数据类型,
data shoppingList = shoppingList { name :: String
, items :: [Item]}
data Item = Food String Float | Clothes String
我需要创建一个 Show 的实例声明,以便任何 shoppingList 看起来像name: dog_food -> CLOTHES -> many_apples -> CLOTHES
,这取决于它是 Food 还是 Clothes。这意味着,如果是 Food,它会打印给食物起的名字,如果是 Clothes,它每次只打印“CLOTHES”。
我设法做的最好的事情是,
instance Show shoppingList where
show (shoppingList n l) = show n ++ ": " ++ show l
instance Show Item where
show (Food n _) = show n
show (Clothes_) = "CLOTHES"
但是,这不是我正在寻找的最终结果,因为它正在打印类似的东西"list1": ["dog_food",CLOTHES,"many_apples",CLOTHES]
,这不是我需要的。
这个例子可能看起来有点愚蠢,但它显示了我的大问题。有人可以帮我吗?
解决方案
据我了解,您已经得到了冒号左侧的部分;您只需要右边的部分。
正如你所指出的,show
不做你想做的事——这意味着你必须自己做这个字符串操作。
这个特定的任务(在列表中插入字符串)可以很容易地使用intercalate
from Data.List
(在此处记录)。
import Data.List (intercalate)
然后,您的实例声明ShoppingList
(注意大写 S)如下:
instance Show ShoppingList where
show (ShoppingList n l) = show n ++ ": " ++ intercalate " -> " (map show l)
作为旁注,它是违反直觉的(至少对我而言)name
是 aFloat
而不是 a String
(或类似的)。你可能应该考虑改变它。
推荐阅读
- sql - 如何使用多个表进行 sql 查询,每个表都有 onde 条件?
- react-native - 您如何将图标添加到此选项卡导航器?
- reactjs - 获取当前位置后设置初始区域不起作用
- rest - 当 POST 请求没有正文并且服务器响应是 403 Forbidden 错误时,CORS 失败
- angular - 在(单击)和(焦点)事件上打开 Mat 对话框
- javascript - 我如何在我的搜索框中使用/调用地图 api 使用 javascript 代码来显示城市列表
- c++ - 非标准语法,使用 & 创建指向成员的指针
- javascript - 这是一个受控还是不受控的 React 组件?
- sql - Oracle 没有与此列列表匹配的唯一键或主键
- r - 需要将统计方程解释为 R 以运行 ANOVA 类型的测试