Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从用户输入Haskell读取未知类型的列表:_Haskell_Types_Type Conversion_Typeclass - Fatal编程技术网

从用户输入Haskell读取未知类型的列表:

从用户输入Haskell读取未知类型的列表:,haskell,types,type-conversion,typeclass,Haskell,Types,Type Conversion,Typeclass,假设我有以下功能: readList :: IO [Int] readList = do putStrLn "Please enter the list as a string" putStrLn "Example: input of '1 2 3 4 5' will map to [1,2,3,4,5]" line <- getLine return $ map read $ words line printNaive :: [Int] -> IO ()

假设我有以下功能:

readList :: IO [Int]
readList = do
  putStrLn "Please enter the list as a string"
  putStrLn "Example: input of '1 2 3 4 5' will map to [1,2,3,4,5]"
  line <- getLine
  return $ map read $ words line

 printNaive :: [Int] -> IO ()                                                                                                                                                         
 printNaive xs = putStrLn "The maximum surpasser count is:" >> putStrLn "0"

 main :: IO ()
 main = readList >>= printNaive
如果我真的不在乎它是什么类型的东西,只要它符合
Eq
,我该如何编写这段代码呢

另外,假设我想提供一个工具来指定列表将包含的类型。(通过另一个getLine说)


如何从
getLine
中提取类型,然后如何将
map read$words line
中的每个元素强制转换为该特定类型。

您所做的错误在于这一行:

readList :: (Read a, Int a) -> IO [a]
您可能希望通过
(读取a,Int a)
获得类型
a
的类型类结构,这意味着您希望它可读,并且希望它是某种整数

首先,你把约束写错了。typeclass约束在
=>
之前给出,而不是
->
之前。其次,
Int
不是类型类。也许可以尝试使用
积分

因此,您的类型签名应如下所示:

readList :: (Read a, Integral a) => IO [a]

EDIT:但是,需要注意的是,类型签名中的
A
必须在编译时确定。在您问题的第一个示例中,这是可行的,因为
printNaive
的类型将
a
固定为
Int
。但通常情况并非如此。

请发布导致此错误的确切代码。在最小化过程中不要走捷径,猜猜是哪种代码。通过将其放在单独的文件中并检查它是否确实会给您带来预期的错误来进行验证。您可能只需从函数中删除类型签名,并使用ghci向ghc询问最通用的类型,加载程序并键入
:t readList
edited question以包含更多代码,因为原始集没有,事实上,一个最小的可重复性example@AbrahamP您仍然没有成功地提供与所显示的错误匹配的代码。根本没有办法不关心它是什么类型。但是字符或自定义类似的东西呢?假设我想要一个函数,它可以将“a b c d e f”读入[“a”、“b”、“c”、“d”、“e”、“f”]及"1 2 3 4 5"分为["1,"2,"3,"4,"5”]此答案解决了呈现的代码中的语法错误。但是,呈现的代码与问题或错误消息不匹配。@AbrahamP您无法读取任何类型的数据以在运行时确定。类型必须在编译时静态已知。@Thomas您当然是对的。但是在问题的特定代码中以上修改仍然可以。我会编辑答案,包括你的评论。
readList :: (Read a, Int a) -> IO [a]
readList :: (Read a, Integral a) => IO [a]