gpt4 book ai didi

haskell - 检查字符串是 Haskell 中不区分大小写的回文

转载 作者:行者123 更新时间:2023-12-05 09:02:37 26 4
gpt4 key购买 nike

我正在尝试编写一个函数来检查字符串是否为 Haskell 中的回文(不区分大小写)。为确保大写字符不会导致问题,我首先使用 toLower ( https://hackage.haskell.org/package/text-2.0/docs/Data-Text.html#v:toLower ) 将字符串转换为小写。然后我检查它是否等于同一事物的反转版本。这是我的代码:

{-# LANGUAGE OverloadedStrings #-}
import Data.Text (toLower)


isPalindrome :: String -> Bool
isPalindrome xs = toLower xs == toLower $ reverse xs

我意识到 toLower 使用 Text 而不是 String,我们需要使用 {-# LANGUAGE OverloadedStrings #-} 将 String 重载为 Text。但这不会编译。

我也在 GHCI 中复制了这个。我首先使用 :set -XOverloadedStrings 来确保重载字符串。然后我运行这个:

Prelude Data.Text> toLower $ reverse "sdssSDSS"

<interactive>:92:11: error:
• Couldn't match expected type ‘Data.Text.Internal.Text’
with actual type ‘[Char]’
• In the second argument of ‘($)’, namely ‘reverse "sdssSDSS"’
In the expression: toLower $ reverse "sdssSDSS"
In an equation for ‘it’: it = toLower $ reverse "sdssSDSS"

我不明白为什么这不起作用。如果我首先运行 reverse "sdssSDSS" 并将结果复制粘贴到 toLower 中,它可以正常工作。

最佳答案

and we need to use {-# LANGUAGE OverloadedStrings #-} to overload String to Text

没有。该扩展名应该被称为 OverloadedStringLiterals .它只会改变 文字 的行为,例如 "hello""sdssSDSS" , 但不在 String 之间转换和 Text否则。通常,自动转换从不在 Haskell 中发生,所有发生的是您可以拥有多态值,例如具有该扩展名的数字文字或字符串文字。

在现代 Haskell 中,最好的选择可能就是将其全部写在 Text 中。永远不要介绍String完全:

import qualified Data.Text as Txt

isPalindrome :: Txt.Text -> Bool
isPalindrome xs = Txt.toLower xs == Txt.toLower (Txt.reverse xs)

(请注意,您不能在此处使用 $,因为它的优先级低于 ==)。

但是您不需要使用Text根本上,还有单字符版本的 toLower :

import Data.Char (toLower)

isPalindrome :: String -> Bool
isPalindrome xs = map toLower xs == map toLower (reverse xs)

顺便说一句,在这两种情况下都可以使用 toLower只有一次:

isPalindrome :: String -> Bool
isPalindrome xs = xsLC == reverse xsLC
where xsLC = map toLower xs

关于haskell - 检查字符串是 Haskell 中不区分大小写的回文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71145144/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com