Haskell如何将单字符String转换为Char?
如何将单字符String转为Char并判断是否为数字?
你遇到的报错是因为类型不匹配:isDigit的类型是Char -> Bool,只能接受单个Char参数,但你之前的写法isDigit head x是把head(一个函数)和x作为两个参数传给isDigit,完全不符合它的参数要求,所以编译器找不到对应类型的isDigit。
下面是几种正确的实现方式:
方法1:使用head函数
Haskell里的String本质是[Char](字符列表),对于单元素列表,head函数会直接返回列表里的唯一字符。给head x加上括号,让它先执行得到Char,再传给isDigit即可:
isDigit (head x)
注意:如果输入的String是空列表,
head会抛出异常,需确保输入确实是单字符String。
方法2:模式匹配
如果能确定输入一定是单字符String,可以用模式匹配直接提取字符,还能顺便处理非单字符的情况:
isSingleDigit :: String -> Bool isSingleDigit [c] = isDigit c -- 匹配单字符列表,提取字符c isSingleDigit _ = False -- 空列表或多字符的情况返回False
方法3:使用索引!!
!!可以按索引取列表元素,单字符String的第一个元素索引是0,写法如下:
isDigit (x !! 0)
和
head一样,空列表时会抛异常,需要保证输入合法。
更安全的处理方式
如果担心输入可能是空列表或多字符,想要避免异常,可以用Data.Maybe里的listToMaybe,它会把列表转为Maybe Char(空列表返回Nothing,单元素返回Just c),再结合<$>把isDigit作用上去:
import Data.Maybe (listToMaybe) safeIsDigit :: String -> Maybe Bool safeIsDigit s = isDigit <$> listToMaybe s
调用后,输入"3"返回Just True,输入"A"返回Just False,输入""或"ab"返回Nothing。
内容的提问来源于stack exchange,提问作者Heikki
相关产品推荐
相关产品推荐

