Haskell 正确使用'reads'返回Int和String的元组

Haskell 正确使用'reads'返回Int和String的元组,haskell,Haskell,我正在尝试使用Prelude中的reads函数,并使用doctest对其进行测试。只需加载GHCI并键入读取“57x”或Prelude.reads“57x”只会生成一个空列表[],因此我认为我必须自己导入该函数。根据文档,它应该返回一个元组。但是在运行Doctest和GHCI时,我得到了一个错误***异常:Prelude.read:no parse,当放入除整数外还有字符的任何测试时,即54x。我需要做什么更改才能让它返回正确的元组,如前所述,但使用int而不是double 我有一个haskel

我正在尝试使用Prelude中的
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)]
,在这种情况下,
[]
将是正确的结果。