【问题标题】:how to display only the title from the tuple in haskell?如何仅显示haskell中元组的标题?
【发布时间】:2015-03-10 15:06:11
【问题描述】:

我有以下创建数据库的代码...

type Title = String
type Singer = [String]
type Year = Int
type Fan = String
type Fans = [Fan]

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

type Database = [Film]  

filmDatabase :: Database
filmDatabase = [("Wrapped up", ["Olly Murs"], 2014, ["Garry", "Dave", "Zoe", "Kevin", "Emma"]),
            ("Someone Like you", ["Adele"], 2011, ["Bill", "Jo", "Garry", "Kevin", "Olga", "Liz"]),

然后我使用以下代码搜索 A 粉丝并显示他们喜欢的所有音乐。

fanOfFilms :: Fan -> Film -> Bool 
fanOfFilms fan (t, _, _, f) 
  |elem fan f = True
  |otherwise = False

givenUser :: Fan ->[Film]
givenUser fan = filter (fanOfFilms fan) testDatabase

我现在想使用此代码并使其仅显示标题。我该怎么做呢?我尝试过使用 map 并尝试使用模式匹配但无法让它工作?!

我试过的代码

   titleOnly :: (t, a, y, f) -> (t, f)
   titleOnly (t, _, _, f) = (t, f)`

然后我尝试将其链接到 FansFilms,但它看起来很乱,我不知道如何正确

【问题讨论】:

  • 好吧,我尝试编写一个函数:titleOnly :: (t, a, y, f) -> (t, f) titleOnly (t, _, _, f) -> (t, f),然后我尝试使用 titleOnly 调用 givenUser 所以它只打印标题和风扇,但这没有用
  • 很抱歉现在这样做了@bheklilr
  • 我建议使用实际的类型别名而不是你所拥有的。试试filmTitle :: Film -> TitlefilmTitle (t, _, _, _) = t。这基本上就是你所拥有的,我更改了函数名称,它只是获得了一部电影的标题。您可以通过模式匹配非常相似地定义filmActorfilmYearfilmFans。如果您想同时获取数据库中所有电影的标题和粉丝,则可以将 filmTitlefilmFans 组合成一个新函数,但这通常使用 lambda 来完成,例如 map (\f -> (filmTitle f, filmFans f)) filmDatabase .
  • 好的,我知道你做了什么只得到电影名称,但是我如何将filmTitle 的这个函数应用到我上面使用的givenUser 函数
  • 您的givenUser 函数返回[Film]。尝试使用:type map (\f -> (filmTitle f, filmFans f)) 在 GHCi 中检查上面给你的map 的类型。还要记住type Database = [Film]

标签: list haskell tuples


【解决方案1】:

您可以创建一个函数,给定Film,返回其标题:

filmTitle :: Film -> Title
filmTitle (t, _, _, _) = t

然后将这个函数映射到givenUser返回的Films列表。

givenUserTitles :: Fan -> [Title]
givenUserTitles fan = map filmTitle (givenUser fan)

【讨论】:

  • 谢谢,我只是在研究高阶函数,所以在必须使用它们时忘记它们。这真的让事情变得清楚了,谢谢。
【解决方案2】:

要获取元组中的第一项,请使用fst。您可以使用snd 获得第二项,这很有用,因为很多时候您将使用有序对作为元组。我认为从元组中获取标题的最易读的方法是:

title :: Film -> Title
title (t,_,_,_) = t

为了吸引粉丝,

fans :: Film -> Fans
fans (_,_,_,f) = f

现在您要做的是将粉丝与他们喜欢的所有游戏匹配,对吗?这意味着如果粉丝是粉丝列表的成员,您将需要检查每部电影的标题。您可以使用elem 函数来做到这一点。

让我知道这是否有效!

【讨论】:

    【解决方案3】:

    使用lens 包(不是我说你应该使用它),你可以使用_1_2 等...

    例子

    ("title", "actor", "year", "fans") ^. _4
    >>> "fan".
    

    但是,在这种情况下,您可能应该使用记录。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多