mar*_*are 8 haskell pattern-matching type-constructor
显然,以下功能是不可能的,因为不可能永久地打开IO值(忽略unsafePerformIO或类似的):
unwrapIO :: IO String -> String
unwrapIO (IO str) = str
Run Code Online (Sandbox Code Playgroud)
但是,类似的功能如下:
unwrapJust :: Maybe String -> String
unwrapJust (Just str) = str
unwrapJust Nothing = "ignore this plz"
Run Code Online (Sandbox Code Playgroud)
我完全理解为什么#2可能的原因,但#1不是,但我不明白如何.我也可以制作自己不能解开的类型吗?
Li-*_*Xia 11
Just并且Nothing是该类型的数据构造函数Maybe a.IO没有数据构造函数可以说(在GHC中它实际上有构造函数,但它们实际上是GHC的实现细节,其他实现可能有IO不同的定义).
unwrapIO (IO str) = str以同样的方式unwrapMaybe (Maybe str) = str没有意义没有意义.IO并且Maybe不是数据构造函数,因此您无法对它们进行模式匹配.
这是因为IO没有导出数据构造函数.我的意思是,你可以认为它没有出口.
您可以使用相同的策略防止自己的类型被打开.
module Test (Test, test) where
data Test a = MkTest a
test :: a -> Test a
test = MkTest
Run Code Online (Sandbox Code Playgroud)
您可以创建值Test使用test,但使用模式匹配你不能解开它,因为MkTest没有出口.