初学者:在Haskell中转换类型
第一个帖子在这里,请对我放轻松。发现了几个有类似问题的线程,没有一个线程直接应用,或者如果有一个线程应用了,那么执行过程就足够让我头疼了 如果我的代码初学者:在Haskell中转换类型,haskell,types,Haskell,Types,第一个帖子在这里,请对我放轻松。发现了几个有类似问题的线程,没有一个线程直接应用,或者如果有一个线程应用了,那么执行过程就足够让我头疼了 如果我的代码p=['1','2','3','4']将数字存储为p中的字符,我如何创建一个可以等于[1,2,3,4]的列表q? 我一直在尝试各种各样的事情,主要是我的q超出了范围,或者任何我试图转换的函数Char->Int都没有附带的绑定。 我似乎到处都能找到这样一种迹象,即存在digitToInt,其中digitToInt'1'应产生1的输出,但我显然缺乏绑定
p=['1','2','3','4']
将数字存储为p
中的字符,我如何创建一个可以等于[1,2,3,4]
的列表q
?
我一直在尝试各种各样的事情,主要是我的q超出了范围,或者任何我试图转换的函数Char->Int
都没有附带的绑定。
我似乎到处都能找到这样一种迹象,即存在digitToInt
,其中digitToInt'1'
应产生1
的输出,但我显然缺乏绑定,即使使用此页面的确切输入:
在这一点上读更多的东西,我只是变得更加困惑。请帮助我找到一个可行的解决方案,告诉我哪里出了问题,或者解释一下为什么这个digitToInt::Char->Int
似乎一点也不适合我
谢谢。DigitPoint已经存在了。它以前住在
Char
模块中,但现在它住在Data.Char
中,因此我们必须导入Data.Char
才能使用它
Prelude> import Data.Char
Prelude Data.Char> digitToInt '1'
1
您可以使用map digitToInt
对列表的每个元素使用digitToInt
<代码>映射::(a->b)->[a]->[b]将函数(a->b)
应用于a
s、[a]
列表的每个元素,以获得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
在不导入任何内容的情况下,您也可以使用一个非常简单的技巧,在读取值之前,将(
(:[])
)字符推送到一个空列表(生成一个单例列表):
map (read . (:[])) "1234"
这将需要列表类型的上下文是可推断的,但它将适用于您想要的任何类型,而无需修改。否则,您需要自己指定类型:
(map (read . (:[])) "1234") :: [Int]
-- [1,2,3,4]
(map (read . (:[])) "1234") :: [Double]
-- [1.0,2.0,3.0,4.0]
您需要导入
Data.Char
才能访问digitToInt
功能。然后,您可以使用映射DigitPoint p
将函数映射到列表中。还要注意的是,['1','2','3','4']
相当于“1234”
@domi当您寻找一个函数或一个与已知签名匹配的函数时,请使用它来查找所有的黑客或标准库。@gxtaillon我被困在一个更简单的层次上。在我开始寻找更多函数之前,我至少应该让真正基本的函数为我工作,而且似乎我写的每一行都像x::。。。我回来时不在“x”范围内。我正在关注youtube教程,并将其与我看到的为他人工作的内容放在一起。不确定使用Eclipse是否会导致这种情况,但我觉得很奇怪…@domi Eclipse?上次我检查的时候,插件根本就没什么用处。出于所有目的,对于简单的应用程序,我会坚持使用文本编辑器和ghci
,对于更大的应用程序,我会坚持使用cabal
。您使用过ghci吗?没有,我想习惯在一个环境中工作,这个环境为我提供了一个代码记事本区域和控制台命令面板,这样我就可以在控制台中玩,然后在工作时添加到源代码中。我想我已经习惯了MatLab,现在太喜欢快速跑步了我会听从您的建议,现在就尝试ghci
,但是如果您能想到一个合适的分屏环境,请告诉我。谢谢!我不知道导入模块。