Haskell 正确使用'reads'返回Int和String的元组
我正在尝试使用Prelude中的Haskell 正确使用'reads'返回Int和String的元组,haskell,Haskell,我正在尝试使用Prelude中的reads函数,并使用doctest对其进行测试。只需加载GHCI并键入读取“57x”或Prelude.reads“57x”只会生成一个空列表[],因此我认为我必须自己导入该函数。根据文档,它应该返回一个元组。但是在运行Doctest和GHCI时,我得到了一个错误***异常:Prelude.read:no parse,当放入除整数外还有字符的任何测试时,即54x。我需要做什么更改才能让它返回正确的元组,如前所述,但使用int而不是double 我有一个haskel
reads
函数,并使用doctest对其进行测试。只需加载GHCI并键入读取“57x”
或Prelude.reads“57x”
只会生成一个空列表[]
,因此我认为我必须自己导入该函数。根据文档,它应该返回一个元组。但是在运行Doctest和GHCI时,我得到了一个错误***异常:Prelude.read:no parse
,当放入除整数外还有字符的任何测试时,即54x
。我需要做什么更改才能让它返回正确的元组,如前所述,但使用int而不是double
我有一个haskell文件,如下所示:
module StackOverflow where
import Prelude hiding (words, reads)
reads :: String -> [(Int, String)]
-- ^ Takes a string, like "57" and reads the corresponding integer value
-- out of it. It returns an empty list if there is a failure, or a list
-- containing one tuple, with the integer value as the first element of
-- the tuple and a (possibly empty) string of remaining unconvertable extra
-- characters as the second element.
--
-- Examples:
--
-- >>> reads "57"
-- [(57,"")]
--
-- >>> reads "57x"
-- [(57,"x")]
--
reads s = [(read s :: Int,"")]
出现“无解析”异常的原因是该类型默认为
Int
(在本例中为()
)以外的类型。因此,实际上,表达式读取“54x”
是在类型[((),String)]
处计算的。这是因为,为了选择适当的Read
实例,必须在编译时完全指定类型,但这是不可能的,因为它不知道字符串
应该包含什么
通过提供显式类型签名,您可以告诉它您希望从字符串中得到什么类型,如下所示
reads "54x" :: [(Int, String)]
所有表达式都可以给出显式类型签名,事实上,有时,为了避免不明确的类型,这是必要的。您想使用内置的读取或定义您自己的吗?我正在尝试使用我自己的并覆盖前奏,因为预定义的前奏在GHCI解释器中不起作用。当您尝试使用前奏时,它在做什么?你只是因为前奏曲似乎不起作用才想写一部新的吗?对。如果我在文件模块测试中有以下内容,其中导入前奏曲
(带或不带导入前奏曲
),键入读“54x”
或前奏曲.reads“54x”
(带或不带x
),我仍然会得到一个空列表[]
。这就是为什么我自己添加了这个函数,并且在我的SO问题中提到的words
方面出现了问题,这是由于所谓的类型默认。由于读取
多态签名,您需要提供类型签名,以便它知道您期望的类型。尝试读取“54x”::[(Int,String)]
。如果没有类型签名,我相信它默认为类型[((),String)]
,在这种情况下,[]
将是正确的结果。