【问题标题】:I have a few questions about this Haskell function我对这个 Haskell 函数有几个问题
【发布时间】:2021-12-26 05:14:45
【问题描述】:
prefix :: String -> String -> Bool
prefix [] _ = True
prefix _ [] = False
prefix (x:xs) (y:ys) = (x == y) && (prefix xs ys)

我有这个 Haskell 函数,我们在其中检查第一个字符串是否是另一个字符串的前缀。

有些东西我真的不明白。

为什么前缀 [] _ 为真?为什么反过来又是错误的呢? 我的意思是,如果两者都是空的,难道没有什么是无的前缀吗?

另外,我是否了解该功能如何正常工作?

我们从第一个字符串中取出第一个符号,然后从第二个字符串中取出第一个符号,看看它们是否相等,然后我们调用相同的函数,字符串短一个字符?

另外,我们使用前缀实现来创建一个函数 substring 来检查一个字符串是否是另一个字符串的一部分

substring :: String -> String -> Bool
substring x y
    | length x > length y = False
    | otherwise = prefix x y || substring x (tail y)

我也无法理解 substring 函数的一般工作原理。为什么长度x大于y一定是前缀?

【问题讨论】:

  • 我投票结束这个问题,因为问题已被破坏
  • @MichaelLitchard 这不是关闭的理由。只需还原。

标签: haskell functional-programming


【解决方案1】:

我的意思是,如果两者都是空的,难道没有什么是无的前缀吗?

如果两者都为空,则第一个子句将触发并因此返回True。第一个子句 nothing 说明了第二个参数。它只是说“如果第一个列表为空,那么它是True。这意味着我们在第二个子句中知道第一个列表不是为空的。

另外,我是否了解该功能如何正常工作?

第一个子句说如果前缀是一个空列表,那么第一个列表是第二个列表的前缀。第二个子句说如果字符串为空(并且前缀不为空),那么第一个列表不是第二个的前缀。

最后最后一个子句说,如果两个列表都不为空,那么如果两个列表的第一个元素相同,则第一个列表是第二个列表的前缀,并且前缀的尾部是字符串的尾部。因此,最后一个子句会将光标移到两个列表的右侧,并检查剩余的前缀是否是剩余字符串的前缀。

【讨论】:

  • 非常感谢您的回答!
  • 我用另一个函数编辑了这个问题。如果你也能帮我解决这个问题,那将是一个巨大的帮助!
  • @Quin:我建议你问一个新问题。通常每个问题应该是关于一个项目。
【解决方案2】:

我们从第一个字符串中取出第一个符号,然后从第二个字符串中取出第一个符号,看看它们是否相等,然后我们调用相同的函数,字符串短一个字符?

您对函数工作原理的理解是正确的。

该函数接受 2 个字符串参数,并检查第一个参数是否是第二个的前缀。空字符串[] 始终是任何其他字符串的前缀,这就是它为输入[] _ 返回True 的原因。反之则不成立,非空字符串x 不是空字符串y 的前缀。

【讨论】:

    猜你喜欢
    • 2011-01-20
    • 2020-03-21
    • 2019-07-03
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多