繁体   English   中英

初学者:在Haskell中转换类型

[英]Beginner: Converting Types in Haskell

第一篇文章,请放轻松我。 找到了几个有类似问题的线程,没有一个是直接应用的,如果有的话,执行就足够了。

如果我有代码p=['1','2','3','4']将数字存储为p字符,我如何创建一个等于[1,2,3,4]的列表q 我一直在尝试各种各样的事情,主要是我的q超出范围或任何函数我试图转换Char -> Int缺乏伴随绑定。 我似乎到处都发现有这样的东西,如digitToInt ,其中digitToInt '1'应该产生1的输出,但我显然缺少绑定,即使从这个页面的确切输入:http: //zvon.org/other /haskell/Outputchar/digitToInt_f.html

在这一点上阅读更多的东西我只是变得更加困惑。 请帮助一个可行的解决方案,可能会告诉我在哪里弄乱或解释为什么这个digitToInt :: Char -> Int似乎对我来说不起作用。

谢谢。

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 S, [a]得到的列表b S, [b]

Prelude Data.Char> map digitToInt ['1', '2', '3', '4']
[1,2,3,4]

缺乏附带的约束力

您不需要通过编写类型签名digitToInt :: Char -> Int来定义digitToInt或其他导入。 签名没有这样的约束

alwaysSeven :: Char -> Int

将给出以下错误。

The type signature for `alwaysSeven' lacks an accompanying binding

您只能在声明之前提供类型签名。

alwaysSeven :: Char -> Int
alwaysSeven x = 7

在不导入任何内容的情况下,您也可以使用非常简单的技巧,并在read值之前将( (:[]) )字符放入空列表(制作单例列表)中:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM