Haskell检测字符转整数是否大于127代码报错问题排查
问题分析与解决
咱们一步步拆解你遇到的两个核心错误,再给出针对性的修复方案:
错误1:Ambiguous type variable ‘m0’
你写的isbinary函数用了do和return,这会让函数返回类型变成某个Monad包裹的字符串(比如IO [Char]),但编译器无法确定你想用哪一种Monad——毕竟return可以作用在任何Monad实例上。其实这个场景完全没必要用Monad,你只是需要一个纯逻辑判断,直接返回Bool类型就足够,print本身就能直接打印Bool值。
错误2:No instance for (Num Char)
字符串mystr的类型是[Char],每个元素是Char类型,而>127是针对数值类型的比较操作。你需要先把Char转换成对应的Unicode码点(整数),这时候要用到Data.Char模块里的ord函数——它能把字符转成对应的Int值。
修正后的代码
首先导入Data.Char模块,然后调整isbinary的实现:
import Data.Char (ord) isbinary :: String -> Bool isbinary ss = any (\c -> ord c > 127) ss mystr = "this is a test" main = do print (isbinary mystr)
运行这段代码会输出False,因为你的测试字符串里所有字符的码点都小于127。如果把mystr改成包含'ć'(码点263)这类字符,就会输出True。
额外说明
如果你确实想让isbinary返回字符串形式的"True"/"False"(而非Bool类型),也不需要用do和return,直接用show函数转换结果即可:
import Data.Char (ord) isbinary :: String -> String isbinary ss = show $ any (\c -> ord c > 127) ss mystr = "this is a test" main = do print (isbinary mystr)
这样运行后会输出"False"(带引号的字符串),你可以根据实际需求选择对应的实现方式。
内容的提问来源于stack exchange,提问作者rnso
相关产品推荐
相关产品推荐

