【问题标题】:Haskell printing all elements of a list within tupleHaskell在元组中打印列表的所有元素
【发布时间】:2023-03-09 21:03:01
【问题描述】:

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

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"])]

【问题讨论】:

  • 找不到影片怎么办?例如printFans testDatabase "Star Wars"?
  • 这也是一个问题,但可以在实现初始功能后解决
  • 可以处理在 UI 开发过程中捕获不正确的输入
  • 风扇应该如何打印?采用什么格式?
  • 你试过什么?你在哪里卡住了,你能用你想要的格式从一堆字符串中创建一个字符串吗?

标签: string list haskell tuples


【解决方案1】:

对所有事物都使用类型同义词真的是在自取其辱。 data Film = Film Title Director Year Fans 在这种情况下比使用元组要好得多。定义一个单独的Film 数据类型将FilmTitleDirectorYearFans 的元组之间的语义差异带入类型系统。这意味着您可以为它定义实例(如ShowEq),它们的行为方式与元组所提供的方式不同。它还会导致编译器拒绝(可能意外地)将恰好具有(String,String,Int,[String]) 类型的元组与实际Film 混合的代码。这增加了安全性,这是首先使用 Haskell 的主要原因之一。

也就是说,无论哪种方式,仅列出粉丝都非常简单:

listFans :: Film -> String
-- data way
listFans (Film _ _ _ fans) = intersperse ',' fans
-- tuple way
listFans (_,_,_,fans) = intersperse ',' fans

接下来,我们需要lookupFilm :: Database -> Title -> Maybe Film 来找到我们想要的电影。我们需要Maybe,因为Film 可能不在Database 中。

lookupFilm :: Database -> Title -> Maybe Film
lookupFilm db t = find (\(Film t' _ _ _) -> t == t') db

请注意,这不会“打印”字符串,它只是返回它们,因此您需要putStrLn . listFans :: Film -> IO () 才能实际输出它们。

如果您总是按标题查找电影,不妨使用Data.Map 中的Map Title Film

最后:确保您了解findintersperse 的工作原理; Data.List 就像得到一条鱼,但您需要学习如何为自己钓鱼,以便在出现更复杂的问题时解决它们。

【讨论】:

  • 感谢您的反馈,我们将研究使用数据方法的任何方式,您可以详细说明为什么这种方法更可取
猜你喜欢
  • 2015-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多