【问题标题】:Haskell list within a list within a listHaskell 列表中的列表 列表中的列表
【发布时间】:2015-04-12 02:19:38
【问题描述】:

我正在学习 Haskell,我有一个问题,如果给定一个字符串列表的列表,我必须在整个初始列表中找到字符串的总数。我的过程是将整个初始列表转换为一维列表并获取长度,但我似乎可以弄清楚。

到目前为止我所拥有的:

type Word = String
type Line = [Word]
type Page = [Line]
type Doc = [Page]
numWords :: Doc -> Line -> Word -> Int

我需要找出单词的数量,我不确定这是否是解决这类问题的最佳方法,但我无所适从。

任何帮助将不胜感激。 谢谢。

【问题讨论】:

    标签: list haskell


    【解决方案1】:

    这是一个相当简单的问题。

    如果我们看一下类型,就很容易了:

    type Word = String
    type Line = [String]
    type Page = [[String]]
    type Doc  = [[[String]]]
    

    获取Line的长度并不难:

    lenLine x = length x
    

    Page 只是所有内部长度的总和:

    lenPage xs = sum $ map lenLine xs
    

    我们可以对Doc使用同样的模式:

    lenDoc xs = sum $ map lenPage xs
    

    至于您的最终功能,只需使用所有其他功能:

    numWords :: Doc -> Page -> Line -> Int
    numWords dc pg ln = lenDoc dc + lenPage pg + lenLine ln
    

    请记住,类型同义词并不意味着类型实际上不同;您可以使用相同的功能。

    【讨论】:

    • 非常感谢!因为我来自 Java,所以数据类型的东西让我很困惑。看起来很不一样。
    • @Jon 别担心 - 它会在你身上生长 :)
    • 它确实在你身上生长。 :) 使用 Haskell 一段时间后,你会发现 Java 越来越笨拙。
    • @Jon 请记住,让 numWords 获取文档和页面以及一行可能会根据您传递的内容对某些行进行三次计数。最简单的方法是只需使用 AJ 提供的 lenDoc 函数,除非您有特殊需要做其他事情。
    猜你喜欢
    • 2021-08-06
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多