如何输入演员表

usr*_*usr 14 haskell casting

C#:

static int F(object x)
{
 return x is string ? 1 : 2;
}
Run Code Online (Sandbox Code Playgroud)

哈斯克尔? 在我看来,棘手的一点是Haskell没有根类型对象.

编辑:我不关心转换为字符串.我想知道如何进行类型转换(例如,查看对象客户还是订单.

Dar*_*rio 37

在Haskell中,允许转换为字符串的所有类型都实例化了Show提供的类型类

show :: Show a => a -> String
Run Code Online (Sandbox Code Playgroud)

所以你的整个代码都不过是

f x = show x
Run Code Online (Sandbox Code Playgroud)

要么

f = show
Run Code Online (Sandbox Code Playgroud)

使用相同的泛型类型f :: Show a => a -> String(a可与字符串对话的Forall类型,获取此类型的值并返回字符串).

请注意,您不必像在C#中那样进行显式的运行时类型检查; 通用模板在编译时解析.你不需要多态的根类型 - 像C#中的强制转换实际上有点复杂并且违背了语言的概念.它不是允许在类型之间进行任意转换,而是为某些有意义的转换定义了类型类.

请注意,在编译时检查兼容性:

-- Working
f 1
f "Hallo"
f (1, 2)
f [1, 2, 3]

-- Not working
f (\x -> x + 1) 
Run Code Online (Sandbox Code Playgroud)

回答您编辑过的问题:

正如我之前所说,Haskell中不允许任意转换(没有非常不安全的代码).由于Haskell不是面向对象的,因此没有需要任何强制转换的继承关系.根本没有object需要运行时检查/转换的毫无意义的值.要表达替代方案,您必须定义联合类型,类型类或使用Either类型.

在什么情况下你遇到一个Customer或一个对象Order?该类型的值简直是荒谬的.请再次澄清.

至于你的记录器示例:你需要一个类型类:

class Loggable a where
    writeToLog :: a -> IO ()
Run Code Online (Sandbox Code Playgroud)

  • 类型类做了我想要的.尼斯. (3认同)

Kob*_*old 20

Dario是正确的,通常在Haskell中你想要创建一个类型类来调度某些类型.话虽这么说,有在Haskell投一个类型安全的方式.这是Scrap你的样板通用编程库的一部分,它允许你在SYB填充空白时编写复杂嵌套数据类型操作的"有趣"部分.脑部融化得很棒.以下是ppthtml中的演示文稿.

这是演员的样子:

cast :: (Typeable a, Typeable b) => a -> Maybe b
ghci> (cast 'a') :: Maybe Char
Just 'a'
ghci> (cast 'a') :: Maybe Bool
Nothing
ghci> (cast True) :: Maybe Bool
Just True
Run Code Online (Sandbox Code Playgroud)


Mar*_*ijn 9

在具有子类型的语言中进行转换和is/或instanceof有意义.您可以通过以下几种方式回答您的问题:

  • Haskell没有子类型等is/ instanceof作哈斯克尔没有意义; 只有明确的转换.没有object类型可以扩展所有类型.
  • Haskell的类型类提供ad-hoc多态性,并帮助重载多个转换的单个名称.例如(正如其他人指出的那样)show是将任何类型转换为String的重载名称.类型类也可用于隐式地进行某些转换(似乎).
  • 使用类型类,通用Scrap Your Boilerplate库的作者创建了一个安全的强制转换函数(也被其他人指出).