我正在学习Haskell并希望使用"readHex",根据Hoogle的类型:
readHex :: Num a => ReadS a
Run Code Online (Sandbox Code Playgroud)
你如何从这样的功能中"提取"结果?什么是最常见的方式,模式匹配正确的构造函数,即[(a,"")] ??
一般来说,LiftM和提升似乎有一定道理,但是当涉及到"展开"monadic堆栈时我迷失了.
要概括地回答一般问题,从数据构造函数中提取值的唯一方法是模式匹配.某些数据类型带有为您提取值的函数,但这些函数本身是通过模式匹配实现的,或者调用其他函数,即&c.像Data.Map.Map
或者IO
想要隐藏其内部结构的抽象数据类型仍然需要模式匹配才能使用; 不同之处在于它们不会从定义它们的模块中导出它们的构造函数,因此您需要处理的是模块中定义的其他函数及其提供的操作.
要回答具体问题,ReadS
定义如下:
type ReadS a = String -> [(a, String)]
Run Code Online (Sandbox Code Playgroud)
所以它只是一个类型的同义词.你不需要从它ReadS
自己中提取任何东西,它只是一个简写或别名.实际类型是[(a, String)]
,您可以使用与使用列表,元组,String
s等的任何其他方式相同的方式工作.
而且,ReadS
不是Monad
.它是不是Monad
实例的类型的同义词,实际上不能直接组成一个(没有办法以[(a, String)]
实例声明所需的形式编写).