【问题标题】:Position of a sublist in a list haskell子列表在列表haskell中的位置
【发布时间】:2014-07-27 14:08:29
【问题描述】:

好的,如果第一个是第二个的子列表,我正在尝试编写一个函数来确定另一个字符串中一个字符串的位置。假设有一个类似“pie”的字符串和另一个类似“applepie”的字符串,该函数将返回 5,因为“pie”的第一个字母在字符串“applepie”中的位置 5

有人知道我该怎么做吗?

【问题讨论】:

  • 猜猜看,我们确实知道如何做到这一点!但是,当然也有一个想法,不如告诉我们您的想法以及在实现它时遇到的问题?
  • @leftaroundabout 我刚开始使用haskell,所以我不太了解,但我做了一个列表理解函数,当该字母是与“pie”的第一个字母相同,但它不会起作用,因为如果字符串是“church”和“igotochurch”,它将返回 2 个位置,6 和 10,而它应该只返回 6。
  • 您可以在整个列表中使用==

标签: string list haskell sublist


【解决方案1】:

this的问题。几天前有人问过(并回答了),它正好解决了您的问题。

我的解决方案:

findStr :: String -> String -> Maybe Int
findStr pat str = findStrHelp pat str 0
  where
    findStrHelp _ [] _ = Nothing
    findStrHelp pat s@(x:xs) n
      | pat == (take (length pat) s) = Just n
      | otherwise = findStrHelp pat xs (n+1)

要获得此代码,只需删除findStrHelp _ [] _ 行并将Just n 更改为n。还要将类型签名中的Maybe Int更改为Int

【讨论】:

  • @TherreFx 我不熟悉 Maybe 类,但在那种情况下,我已经知道第一个字符串肯定是第二个字符串的子列表,因为我写了一个函数来检查,所以我我猜没有必要使用 Maybe 类。
  • @emic 我添加了如何更改代码的说明,因此您不需要可能,但我强烈建议查看 Haskell 的 Maybe,因为它是语言的核心在这种情况下。
  • s@(x:xs) 是做什么的?
  • @emic s@(x:xs) 是一个 as 模式,基本上可以让您使用 s 作为 (x:xs) 的快捷方式
  • 只是为了确保我理解该函数的工作原理,如果 str 的第一个“部分”等价于 pat,那么它将返回 0,否则它将添加 +1 并再次评估该函数为 str 的尾部。对吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-21
  • 1970-01-01
  • 2023-03-27
相关资源
最近更新 更多