初学者:在Haskell中转换类型

时间:2014-12-30 21:43:57

标签: haskell types

首先在这里发帖,请放轻松我。找到了几个有类似问题的线程,没有一个是直接应用的,如果有的话,执行就足够了。

如果我的代码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似乎对我来说不起作用。

谢谢。

2 个答案:

答案 0 :(得分:9)

digitToInt已经存在。它过去住在Char模块中,但现在它位于Data.Char,因此我们必须import Data.Char才能使用它。

Prelude> import Data.Char
Prelude Data.Char> digitToInt '1'
1

您可以使用digitToInt对列表中的每个元素使用map digitToIntmap :: (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]