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)
Kob*_*old 20
Dario是正确的,通常在Haskell中你想要创建一个类型类来调度某些类型.话虽这么说,有是在Haskell投一个类型安全的方式.这是Scrap你的样板通用编程库的一部分,它允许你在SYB填充空白时编写复杂嵌套数据类型操作的"有趣"部分.脑部融化得很棒.以下是ppt或html中的演示文稿.
这是演员的样子:
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)
在具有子类型的语言中进行转换和is/或instanceof有意义.您可以通过以下几种方式回答您的问题:
is/ instanceof作哈斯克尔没有意义; 只有明确的转换.没有object类型可以扩展所有类型.show是将任何类型转换为String的重载名称.类型类也可用于隐式地进行某些转换(似乎).| 归档时间: |
|
| 查看次数: |
30314 次 |
| 最近记录: |