Fra*_*ian 3 polymorphism haskell functional-programming
我得到了如下数据类型
data Value = IntVal Integer |
BoolVal Bool
deriving Show
Run Code Online (Sandbox Code Playgroud)
我正在尝试编写一个函数getVal,它接受一个Value并返回其中的实际值.我试图用模式匹配来实现
getVal (IntVal val) = val
getVal (Bool bool) = bool
Run Code Online (Sandbox Code Playgroud)
但是Haskell抱怨返回的类型无法将预期类型'Integer'与实际类型'Bool'匹配
所以我给它一个签名返回一个类型变量
getVar :: Value -> a
Run Code Online (Sandbox Code Playgroud)
但它也不会起作用
是的,这可以在类型类或GADT的帮助下处理,或者甚至可以使用cast杠杆作用Data.Typeable.但是当你很好地了解Haskell,以及当你知道自己在做什么时,所有这些都是有用的.
在您的情况下,您应该真正尝试了解Haskell的工作原理.Haskell是关于施加明智的不变量,这使得无法编写"坏"程序(好吧,这就是我说的).这是通过类型系统完成的,如果没有附加这些不变量,你就无法做任何事情.
所以现在,你对类型的东西a做不了多少,因为你对它知之甚少.如果你想从功能可以是返回值Int或Bool(这实际上可以看到存在量化),你将能够在可以上执行该值执行操作Int 和上Bool.例如,您可以获得该值的文本表示.
你想要的不仅仅是机会.在这种情况下,您可能不应该尝试返回Int , Bool同时无法理解您的确切结果.
因此,您可以执行以下操作:
getVar :: Value -> Either Int Bool
Run Code Online (Sandbox Code Playgroud)
或者您可以发送:
case Value of
IntVal x -> doWhatYouWantToDoWithInteger x
BoolVal x -> doWhatYouWantToDoWithBoolean x
Run Code Online (Sandbox Code Playgroud)
这是Haskell的自然流程.在程序的每个分支中,您现在都知道您正在处理什么.
希望能帮助到你.
| 归档时间: |
|
| 查看次数: |
1059 次 |
| 最近记录: |