在Haskell中使用类型a - > b的函数?

Seb*_*ebi 2 haskell types type-inference unification

Haskell中有任何类型的函数a -> b吗?这意味着,是否有可能编写一个这样的函数f :: a -> b?我不认为这样的函数存在以下原因:假设我们发现f在哪里f :: a -> b,会f 2产生什么?类型的值b,但是什么是b因为Haskell不能从我给出的论据推断(我认为)它?它是否正确?否则,你能给我一个这样的功能的例子吗?

lef*_*out 7

除了⊥(底值 - undefined等),这总是可行但从未有用,确实没有这样的功能.这是我们从多态类型签名中得到的所谓自由定理的最简单实例之一.

你已经走上了正确的轨道,直截了当地解释了为什么这是不可能的,尽管它最终会消失.是的,你可以考虑一下f (5 :: Int).问题在于编译器"无法推断" b将会是什么- 例如,许多现实函数的情况就是如此

fromIntegral :: (Num b, Integral a) => a -> b
Run Code Online (Sandbox Code Playgroud)

很有道理; b将从使用的环境中推断出来fromIntegral x.例如,我可能会写

average :: [Double] -> Double
average l = sum l / fromIntegral (length l)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,length l :: a具有固定类型Int并且fromIntegral (length l) :: b必须具有Double适合环境的固定类型,并且与具有类型推断的大多数其他语言不同,来自环境的信息可以基于Hindley-Milner的语言获得.

不,这个问题f :: a -> b是,那么你可以ab任何类型的荒谬组合,而不仅仅是数量的不同类型.因为f是无约束的多态,它必须能够将任何类型转换为任何其他类型.

特别是,它将能够转换为真空类型 Void.

evil :: Int -> Void
evil = f
Run Code Online (Sandbox Code Playgroud)

然后我就可以了

muahar :: Void
muahar = f 0
Run Code Online (Sandbox Code Playgroud)

但是,通过构造Void,不能有这种类型的值(除了⊥,如果没有崩溃或无限循环,你无法评估).


应该注意的是,这是一些标准不是计算平均值的非常好的方法.