String Haskell打印元组中列表的所有元素

String Haskell打印元组中列表的所有元素,string,list,haskell,tuples,String,List,Haskell,Tuples,我正在尝试打印给定电影标题的粉丝列表的所有元素,例如《阿凡达》的所有粉丝都不太确定如何过滤这些元素并将正确的元素显示为字符串。下面是程序的类型定义以及一些测试数据 import Data.Char import Data.List --types type Title = String type Director = String type Year = Int type Fans = [String] type Film = (Title, Director, Year, Fans) t

我正在尝试打印给定电影标题的粉丝列表的所有元素,例如《阿凡达》的所有粉丝都不太确定如何过滤这些元素并将正确的元素显示为字符串。下面是程序的类型定义以及一些测试数据

import Data.Char
import Data.List

--types
type Title = String
type Director = String
type Year = Int
type Fans = [String]

type Film = (Title, Director, Year, Fans)

type Database = [Film]

testDatabase :: [Film]
testDatabase = [
 ("Blade Runner", "Ridley Scott", 1982, ["Zoe", "Heidi", "Jo", "Kate", "Emma", "Liz", "Sam", "Olga", "Tim"]),
 ("The Fly", "David Cronenberg", 1986, ["Garry", "Dave", "Zoe", "Kevin", "Emma"]),
 ("Body Of Lies", "Ridley Scott", 2008, ["Bill", "Olga", "Tim", "Zoe", "Paula"]),
 ("Avatar", "James Cameron", 2009, ["Dave", "Amy", "Liz"]),
 ("Titanic", "James Cameron", 1997, ["Zoe", "Emma", "Paula", "Liz", "Olga", "Dave"])]

你对每件事都使用类型同义词,这真是自讨苦吃
data Film=Film Title Director Year Fans
比在这种情况下使用元组要好得多。定义单独的
电影
数据类型将
电影
标题
导演
年份
粉丝
的元组之间的语义差异引入类型系统。这意味着您可以为其定义实例(如
Show
Eq
),这些实例将以不同于元组的特定方式运行。它还会导致编译器拒绝(可能是意外地)将类型为
(String,String,Int,[String])
的元组与实际的
影片混音的代码。这增加了安全性,这是首先使用Haskell的主要原因之一

也就是说,仅列出风扇非常简单:

listFans :: Film -> String
-- data way
listFans (Film _ _ _ fans) = intersperse ',' fans
-- tuple way
listFans (_,_,_,fans) = intersperse ',' fans
接下来,我们需要一个
lookupFilm::Database->Title->Maybe Film
来找到我们想要的电影。我们需要
可能
,因为
胶片
可能不在
数据库中

lookupFilm :: Database -> Title -> Maybe Film
lookupFilm db t = find (\(Film t' _ _ _) -> t == t') db
请注意,这不会“打印”字符串,它只是返回字符串,因此您需要
putStrLn。listFans::Film->IO()
以实际输出它们

如果您总是按电影的标题查找电影,那么您最好使用
地图标题电影


最后:确保你了解如何工作<代码>数据。列表
就像是给了一条鱼一样,但是你需要学会如何为自己捕鱼,以便在出现更复杂的问题时解决它们。

使用类型同义词来表示一切,你真的是在伤自己的脚
data Film=Film Title Director Year Fans
比在这种情况下使用元组要好得多。定义单独的
电影
数据类型将
电影
标题
导演
年份
粉丝
的元组之间的语义差异引入类型系统。这意味着您可以为其定义实例(如
Show
Eq
),这些实例将以不同于元组的特定方式运行。它还会导致编译器拒绝(可能是意外地)将类型为
(String,String,Int,[String])
的元组与实际的
影片混音的代码。这增加了安全性,这是首先使用Haskell的主要原因之一

也就是说,仅列出风扇非常简单:

listFans :: Film -> String
-- data way
listFans (Film _ _ _ fans) = intersperse ',' fans
-- tuple way
listFans (_,_,_,fans) = intersperse ',' fans
接下来,我们需要一个
lookupFilm::Database->Title->Maybe Film
来找到我们想要的电影。我们需要
可能
,因为
胶片
可能不在
数据库中

lookupFilm :: Database -> Title -> Maybe Film
lookupFilm db t = find (\(Film t' _ _ _) -> t == t') db
请注意,这不会“打印”字符串,它只是返回字符串,因此您需要
putStrLn。listFans::Film->IO()
以实际输出它们

如果您总是按电影的标题查找电影,那么您最好使用
地图标题电影


最后:确保你了解如何工作<代码>数据。列表
就像给了一条鱼一样,但你需要学会如何自己捕鱼,以便在出现更复杂的问题时解决它们。

如果找不到电影怎么办?例如,
printFans testDatabase“Star Wars”
?这也是一个问题,但是可以在实现初始功能后解决。在开发UI时,可以处理捕获错误输入的问题。如何打印fans?以什么形式?你试过什么?你卡在哪里了,你能用你想要的格式从一束线中制作一条线吗?如果找不到电影怎么办?例如,
printFans testDatabase“Star Wars”
?这也是一个问题,但是可以在实现初始功能后解决。在开发UI时,可以处理捕获错误输入的问题。如何打印fans?以什么形式?你试过什么?你在哪里卡住了,你能用你想要的格式从一堆字符串中生成一个字符串吗?感谢反馈,我们将研究如何使用数据方法,你可以详细说明为什么这个方法更可取感谢反馈,我们将研究如何使用数据方法,你可以详细说明为什么这个方法更可取