首先在这里发帖,请放轻松我。找到了几个有类似问题的线程,没有一个是直接应用的,如果有的话,执行就足够了。
如果我的代码p=['1','2','3','4']
将数字存储为p
中的字符,我该如何创建一个等于q
的列表[1,2,3,4]
?
我一直在尝试各种各样的事情,主要是我的q超出范围或我试图转换Char -> Int
缺少伴随绑定的任何功能。
我似乎在任何地方都发现存在digitToInt
这样的事情,其中digitToInt '1'
应该产生1
的输出,但我显然缺少绑定,即使是来自此页面的确切输入:
http://zvon.org/other/haskell/Outputchar/digitToInt_f.html
此时阅读更多内容我变得更加困惑。请帮助一个可行的解决方案,可能会告诉我在哪里弄乱或解释为什么这digitToInt :: Char -> Int
似乎对我来说不起作用。
谢谢。
答案 0 :(得分:9)
digitToInt
已经存在。它过去住在Char
模块中,但现在它位于Data.Char
,因此我们必须import Data.Char
才能使用它。
Prelude> import Data.Char
Prelude Data.Char> digitToInt '1'
1
您可以使用digitToInt
对列表中的每个元素使用map digitToInt
。 map :: (a->b) -> [a] -> [b]
将(a->b)
函数应用于a
,[a]
列表的每个元素,以获取b
s,[b]
的列表。
Prelude Data.Char> map digitToInt ['1', '2', '3', '4']
[1,2,3,4]
您不需要通过编写类型签名digitToInt
来定义digitToInt :: Char -> Int
或其他导入。签名没有像那样的绑定
alwaysSeven :: Char -> Int
会出现以下错误。
The type signature for `alwaysSeven' lacks an accompanying binding
您只能在声明之前提供类型签名。
alwaysSeven :: Char -> Int
alwaysSeven x = 7
答案 1 :(得分:0)
在不导入任何内容的情况下,您也可以使用非常简单的技巧,并在(:[])
值之前将字符推送(read
)空列表(制作单例列表):
map (read . (:[])) "1234"
这将需要列表类型的上下文可以推断,但它适用于您想要的任何类型而无需修改。否则你需要自己指定类型:
(map (read . (:[])) "1234") :: [Int]
-- [1,2,3,4]
(map (read . (:[])) "1234") :: [Double]
-- [1.0,2.0,3.0,4.0]