初学者:在Haskell中转换类型

4

这是我的第一篇帖子,请多关照。我找到了几个与此类似的线程,但没有一个直接适用或者如果有一个适用,那么它的执行步骤远远超过了我的能力范畴。

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

谢谢。


3
你需要导入 Data.Char 才能使用 digitToInt 函数。之后你可以对列表使用 map 函数,使用 map digitToInt p。还要注意,['1', '2', '3', '4'] 等同于 "1234" - Mephy
2
@domi 当你在寻找一个函数或者一个符合已知签名的函数时,可以使用Hayoo来搜索 Hackage 的所有内容,或者使用Hoogle来搜索标准库。 - gxtaillon
@gxtaillon 我卡在了一个更简单的级别。在寻找更多功能之前,我至少应该让那些真正基础的函数为我工作,但似乎每当我写类似x :: ...这样的东西时,我都会得到“未定义'x'”的错误提示。 我正在跟随YouTube教程,并在同样的内容上遇到了其他人看起来能够运行的问题。不确定是否使用Eclipse会导致这种情况,但对我来说似乎非常奇怪... - domi
@domi Eclipse?上次我检查插件时,它们远远不能派上用场。对于所有目的,我会坚持使用文本编辑器和ghci来处理简单应用程序,而对于更大的应用程序则使用cabal。你用过ghci吗? - gxtaillon
不,我想要适应在一个环境中工作,该环境为我提供了代码的记事本区域和控制台命令的面板,这样我就可以在控制台中玩耍,然后在源代码中添加它们。我想我已经习惯了MatLab,并且现在太依赖于快速运行了。 =< 我会听从你的建议,现在尝试使用ghci,但如果你能想到一个不错的分屏环境,请告诉我。 - domi
2个回答

9

digitToInt 是一个已经存在的函数。它原本属于 Char 模块,但现在它属于 Data.Char 模块,因此我们需要导入 Data.Char 模块才能使用它。

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

您可以使用 map digitToInt 在列表的每个元素上使用 digitToIntmap :: (a->b) -> [a] -> [b] 将函数 (a->b) 应用于列表的每个元素 a[a] 以获取一个 b 列表,即 [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
谢谢!我不知道如何导入模块。 - domi

0

即使不导入任何东西,您也可以使用非常简单的技巧,在读取值之前将字符推入空列表(创建一个单例列表)(: []):

map (read . (:[])) "1234"

这将需要可推导出列表类型的上下文,但它将适用于您想要的任何类型,无需修改。否则,您需要自己指定类型:

(map (read . (:[])) "1234") :: [Int]
-- [1,2,3,4]
(map (read . (:[])) "1234") :: [Double]
-- [1.0,2.0,3.0,4.0]

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