模式匹配monadic结果?

ove*_*ore 3 monads haskell

我正在学习Haskell并希望使用"readHex",根据Hoogle的类型:

readHex :: Num a => ReadS a
Run Code Online (Sandbox Code Playgroud)

你如何从这样的功能中"提取"结果?什么是最常见的方式,模式匹配正确的构造函数,即[(a,"")] ??

一般来说,LiftM和提升似乎有一定道理,但是当涉及到"展开"monadic堆栈时我迷失了.

C. *_*ann 7

要概括地回答一般问题,从数据构造函数中提取值的唯一方法是模式匹配.某些数据类型带有为您提取值的函数,但这些函数本身是通过模式匹配实现的,或者调用其他函数,即&c.像Data.Map.Map或者IO想要隐藏其内部结构的抽象数据类型仍然需要模式匹配才能使用; 不同之处在于它们不会从定义它们的模块中导出它们的构造函数,因此您需要处理的是模块中定义的其他函数及其提供的操作.

要回答具体问题,ReadS 定义如下:

type ReadS a = String -> [(a, String)]
Run Code Online (Sandbox Code Playgroud)

所以它只是一个类型的同义词.你不需要从它ReadS自己中提取任何东西,它只是一个简写或别名.实际类型是[(a, String)],您可以使用与使用列表,元组,Strings等的任何其他方式相同的方式工作.

而且,ReadS不是Monad.它是不是Monad实例的类型的同义词,实际上不能直接组成一个(没有办法以[(a, String)]实例声明所需的形式编写).