在Haskell中传递函数签名中的任何类型

Juj*_*ngh 1 syntax haskell

我想传递一个函数一个通配符或任何类型,甚至可以在多种类型之间进行选择,而不是仅仅将其限制为String,或者数字或布尔值,例如:

myFunction :: a -> String
Run Code Online (Sandbox Code Playgroud)

要么

myFunction :: _ -> String
Run Code Online (Sandbox Code Playgroud)

要么

myFunction :: (String || Number) -> String
Run Code Online (Sandbox Code Playgroud)

那可能吗?

lef*_*out 12

myFunction :: a -> String在技​​术上是可行的,但它是无用的 - 因为它必须能够处理任何类型的论证,所以你无法对这个论点做任何事情.(这有点像用一种完全未指明的物质制作罐头 - 如果它有腐蚀性你不会吃它,你不能用于清洁目的,如果它是脂肪,油漆或胶水,你不能进一步处理它...如果是无限制的Haskell类型,你甚至无法分析它.)

如果将其缩小到支持某种常见操作的类型,则多态参数可能有意义:

myFunction' :: Show a => a -> String
myFunction' x = "The value is " ++ show x
Run Code Online (Sandbox Code Playgroud)

您的另一种方法,仅支持两种非常特定的类型,也是可能的:

myFunction'' :: Either String Integer -> String
myFunction'' (Left s) = "Got a string: “" ++ s ++ "”"
myFunction'' (Right n) = "Got a number: " ++ show n
Run Code Online (Sandbox Code Playgroud)

请注意,这两种方法完全不同:Show a => a -> String可以用作String -> String或作为Integer -> String支持show操作的任何其他类型(包括您自己的新定义类型),但您必须在编译时决定所需的类型.在运行时,传递给此函数的所有参数必须具有相同的类型.

Either String Integer -> String可以在运行时接受String- 和Integer值的混合,但始终仅限于这两种类型.