如何编写函数根据用户定义的数据类型返回Integer或Bool?

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)

但它也不会起作用

Mar*_*ark 9

是的,这可以在类型类或GADT的帮助下处理,或者甚至可以使用cast杠杆作用Data.Typeable.但是当你很好地了解Haskell,以及当你知道自己在做什么时,所有这些都是有用的.

在您的情况下,您应该真正尝试了解Haskell的工作原理.Haskell是关于施加明智的不变量,这使得无法编写"坏"程序(好吧,这就是我说的).这是通过类型系统完成的,如果没有附加这些不变量,你就无法做任何事情.

所以现在,你对类型的东西a做不了多少,因为你对它知之甚少.如果你想从功能可以是返回值IntBool(这实际上可以看到存在量化),你将能够在可以上执行该值执行操作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的自然流程.在程序的每个分支中,您现在都知道您正在处理什么.

希望能帮助到你.