Haskell 人物及;串

Haskell 人物及;串,haskell,Haskell,我是haskell的新手,我有一个问题(也就是家庭作业) 因此,我有一个包含元组的列表–一个字符串和一个整数: xxs :: [([Char], Integer)] 我需要知道xxs中有多少字符串以给定字符开头。 让我举例说明: foo 'A' [("Abc",12),("Axx",34),("Zab",56)] Output: 2 foo 'B' [("Abc",12),("Bxx",34),("Zab",56)] Output: 1 我迄今为止最好的尝试是: foo c xxs =

我是haskell的新手,我有一个问题(也就是家庭作业)

因此,我有一个包含元组的列表–一个字符串和一个整数:

xxs :: [([Char], Integer)] 
我需要知道xxs中有多少字符串以给定字符开头。 让我举例说明:

foo 'A' [("Abc",12),("Axx",34),("Zab",56)]
Output: 2 

foo 'B' [("Abc",12),("Bxx",34),("Zab",56)]
Output: 1
我迄今为止最好的尝试是:

foo c xxs = length (foldl (\acc (x:xs) -> if x == c then c else x) [] xxs)
但是,当然,lambda表达式中有一些非常错误的东西

有什么建议吗? 谢谢。

您可以使用折叠,但我建议使用另一种方法,它将问题分为三个步骤:

  • 将输入列表转换为首字母列表。您可以为此使用
    map
  • 筛选出不等于给定字符的所有元素
  • 取剩余列表的
    长度
显然,第一步是最难的,但不像看上去那么难。要做到这一点,您只需以某种方式组合函数
fst
head
,甚至更简单的是,映射两次

您可以将其编写为一个简单的单行程序,但也许您应该从一个
let
开始:

foo c xxs =  let strings = map ...
                 firstLetters = map ...
                 filteredLetters = filter ...
             in length ...
您可以使用折叠,但我建议使用另一种方法,将问题分为三个步骤:

  • 将输入列表转换为首字母列表。您可以为此使用
    map
  • 筛选出不等于给定字符的所有元素
  • 取剩余列表的
    长度
显然,第一步是最难的,但不像看上去那么难。要做到这一点,您只需以某种方式组合函数
fst
head
,甚至更简单的是,映射两次

您可以将其编写为一个简单的单行程序,但也许您应该从一个
let
开始:

foo c xxs =  let strings = map ...
                 firstLetters = map ...
                 filteredLetters = filter ...
             in length ...
我会把foo改写成

foo :: Char -> [(String, Int)] -> Int
foo c = length . filter ((==c).head.fst)
fst
获取两元素元组的第一个元素

(==c)
是一个单参数函数,用于将其输入与
c
进行比较(有关更好的解释,请参见第3.2.1段)。

我将把foo重写为

foo :: Char -> [(String, Int)] -> Int
foo c = length . filter ((==c).head.fst)
fst
获取两元素元组的第一个元素


(==c)
是一个单参数函数,用于将其输入与
c
进行比较(有关更好的解释,请参见第3.2.1段)。

您的尝试存在一些问题:

  • 您计划使用
    foldl
    构建一个较短的列表,然后计算其长度。虽然这是可能的,
    filter
    函数更适合于@landei建议的任务

  • foldl
    可用于累积长度,而无需构建较短的列表。看到@WuXingbo的答案-他的答案是错误的,但是一旦你意识到他的方法根本不需要
    length
    ,你应该很容易找到正确的解决方案

  • 与常识有些矛盾的是,在惰性语言中,
    foldr
    foldl
    更快,占用的内存更少。你应该问你的老师为什么


  • 您的尝试存在一些问题:

  • 您计划使用
    foldl
    构建一个较短的列表,然后计算其长度。虽然这是可能的,
    filter
    函数更适合于@landei建议的任务

  • foldl
    可用于累积长度,而无需构建较短的列表。看到@WuXingbo的答案-他的答案是错误的,但是一旦你意识到他的方法根本不需要
    length
    ,你应该很容易找到正确的解决方案

  • 与常识有些矛盾的是,在惰性语言中,
    foldr
    foldl
    更快,占用的内存更少。你应该问你的老师为什么


  • 你有正确的预感。检查传递到lambda的第二个参数;按照您定义模式的方式,Haskell需要一个列表。如果
    xxs
    是一个列表列表,但它只是一个元组列表,那就好了。尝试一种类似于
    (x,y)
    的模式,看看它能给你带来什么。希望这有帮助@谢谢。这对我真的很有帮助。你的直觉是对的。检查传递到lambda的第二个参数;按照您定义模式的方式,Haskell需要一个列表。如果
    xxs
    是一个列表列表,但它只是一个元组列表,那就好了。尝试一种类似于
    (x,y)
    的模式,看看它能给你带来什么。希望这有帮助@谢谢。这对我真的很有帮助。步骤1可以合并为步骤2。只需根据元组第一部分中字符串的第一个字母是否正确过滤列表。这似乎是op正在尝试的方法,他用foldl编写了自己的
    过滤器
    。这是正确的,但您可以看到当to尝试一次执行太多步骤时发生了什么:-)步骤1可以合并到步骤2中。只需根据元组第一部分中字符串的第一个字母是否正确过滤列表。这似乎是op正在尝试的方法,他用foldl编写了自己的
    过滤器
    。这是正确的,但您可以看到当to尝试一次执行太多步骤时发生了什么:-)