[英]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.