将数字字符串转换为Haskell中的整数列表

8

我正在尝试将一个包含数字的字符串转换为单独的数字。有多种方法可以解决这个问题,其中一种是使用map digitToInt "1234"

我尝试了类似的方法,但不是使用digitToInt,而是使用read::Char->Int函数。然而,当我使用上述内容时,我遇到了编译错误,例如:

map (read::Char->Int) ['1','2']

给我以下错误。我不确定这里出了什么问题,我正在尝试将一个接受Char的函数映射到Char列表上,我错过了什么?

请不要告诉我其他方法,因为我知道有几种其他方法可以做到这一点。只是想了解这里发生了什么。

Couldn't match typeCharwith ‘[Char]’
      Expected type: Char -> Int
        Actual type: String -> IntIn the first argument of ‘map’, namely ‘(read :: Char -> Int)’

默认库中没有 read::Char->Int 函数。在 Prelude 中,read 仅定义为字符串输入。您可以随时查看 haskell.org/hoogle 上的类型定义。 - ShamPooSham
1
模块Data.Char提供了函数digitToInt :: Char -> Int - AJF
4个回答

19

read :: Read a => String -> a字符串转换为可读元素。因此,如果要从字符串中读取数字,则可以使用:

map (read . pure :: Char -> Int) ['1','2']

但如果这些字符是数字,使用 digitToInt :: Char -> Int 函数可能更好:

import Data.Char(digitToInt)

map digitToInt ['1', '2']

8
问题在于 read :: Read a => String -> a。所以应该将 read 应用于 String 而不是 Char。请尝试使用以下代码代替:

 map (read :: String -> Int) ["1", "2"]
 -- or
 map read ["1", "2"] :: [Int] -- same but clearer?

2
啊,完全忘记了read只能接受字符串作为输入!谢谢。 - peeyush singh

4
你可以尝试这样做:map (\x -> read (x:[]) :: Int) "12" 如果你对此有任何疑问,只需搜索lambda表达式即可。

2
你可以尝试这样做:

您可以尝试类似以下的方法:

toInt x = read x :: Int
map (toInt . (:"")) ['1', '2']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接