2012-09-01 42 views
0

this question中出现的类似问题中,Haskell表达式是否可能具有“generic”类型的a?喜欢的东西,Haskell:“generic”类型的表达式

myExpression :: a

我是新来的Haskell,但我已经看到这是无法实现的。

+0

更好的问题可能是“你为什么要这样做?”它在面向对象的语言中可能是有用的,但在Haskell中它根本不会有用。 – MathematicalOrchid

+0

那时我只是对是否可以实现而感到好奇,但现在我真的可以(开始)看到底部表达的有用性,它与部分功能,严格和非严格功能以及评估策略的关系。 – acrespo

回答

7

不,没有任何东西可以满足底部以外的其他要求。

myExpression = myExpression 

-- or, 

myExpression = undefined 

有任何合理的方式,它可以可能?一些非底部表达既是Integer也是Maybe (String -> IO())(例如)。


此外,鉴于the question you mention,一个答案其中证明,用式签名a -> a唯一的非底功能是id,我们有一个证明不可能有非底表达a类型。如果有,那么

f _ = myExpression 

可以有型a -> a,这既不是id也不是底部,也就是一对矛盾。

1

您可以读取该类型签名为“适用于所有类型a,myExpression的类型为a”。这意味着myExpression必须是所有类型中存在的某个值。

从数学角度讲,没有这样的值存在,因为a可能是“獾”或“不是獾的东西”,而这两组必然是不同的。

在Haskell类型系统中,myExpression的唯一有效值是undefined,又名底部。

1

抽象地说,只有一个类型为“a”的值,底部,在运行时有各种可能的解释。

myExpression = myExpression 

这将永不终止。

myExpression = undefined 

这(使用GHC时)打印 “*例外:Prelude.undefined”

myExpression = error "Hello! 

这将打印 “*例外:你好!”

myExpression = unsafePerformIO (launchNukes >> fail "BOOM") 

此版本底部的行为取决于您导入的库。

由于您询问了“通用”类型,因此您可能指可以有用地包含任何值的事物类型。在这种情况下,请查看Data.Dynamic,它允许您将具有内存中表示的任何内容转换为类型为“Dynamic”的值。稍后,在使用“Dynamic”类型的值时,可以尝试将其转换为更具体的类型,以便实际执行某些有用的操作。

+0

值得指出的是,虽然将事物变成“动态”并且可以再次返回是可能的,但对于初学者来说,这远远不可取,尤其是__。 @acrespo:类型'a'代表你喜欢的任何类型,所以如果你有一个函数'a - > Bool',你可以在任何东西上使用它,但是如果它的类型是'Num a => a - > Bool', ,你可以在任何类型的'Num'eric类型中使用它。因此'a'的意思是“任何你喜欢的类型” - 你不需要找到某种类型的“a”来使用这个函数。确保你学习_Learn You Haskell for Great Good_的类型和类型类章节,http://learnyouahaskell.com/。 – AndrewC