[英]Check and find type in Haskell
问题是:
给出
(f True) (f 1)
的类型声明,使其类型正确,或说明为什么它不存在。
请帮助我,因为我无法理解如何定义类型声明。 谢谢。
这是我从您的表达式中推断f
的类型的方法。 请注意,我不是在介绍GHC的工作原理,而是我的“大脑类型检查器”的工作原理。
f True
应用于值,这意味着左侧的f
具有f True :: a -> b
f :: Bool -> a -> b
f True :: a -> b
,因此f :: Bool -> a -> b
。
在右边,我们有f 1
,这意味着在右边f :: (Num a) => a -> b
,这是我的内部类型检查器开始抱怨的时候,因为在左边使用f
时,我看到f
可以应用于Bool
,而右边可以将其应用于数字,但是Bool
不是Num
类的实例。
但是,此类型仍会检查第一个参数是否没有约束,因此我们有f :: a -> b
和...我们真的不能说其他话。 (由于b
可以是任何类型,因此b
实际上很可能是c -> d
,因此我们可以通过部分应用f
获得新函数。)
请注意,尽管即使此类型检查(可以在GHCi中检查它),也不太可能将f
作为有意义的定义,实际上,它可以表示的唯一undefined
const
是const
我认为是正确的,但如果我错了)。 您可以说,因为第一个参数的类型没有任何限制,这很奇怪……
根据您的评论f :: a -> b -> Bool
(我试图从您键入的表达式给出的信息中获得最通用的类型,这是我的结果更加通用。)
只有一种方法可以不使用undefined
来定义这样的函数,它必须是一个既放弃参数又给出常量的函数。 因为无法为任何无法想象的类型定义f
。 所以f
的定义是这样的:
f _ _ = True
将f True
应用于f 1
,将f True :: b -> Bool
应用于函数f 1 :: b -> Bool
,由于b
是类型变量,因此可以很好地键入它,可以是任何东西,尤其是它b
最好是c -> Bool
,在这种情况下, f True
的类型实际上是f True :: (c -> Bool) -> Bool
。 比较清楚吗?
如果您具有f的主体,则可以在GHCI(haskell解释器)中键入“:tf”以获取其类型。
如果您对f的所有了解是(f True)(f 1)进行编译,则f可以是2个变量的任何常数函数,例如\\xy -> 2 :: a -> b -> Int
或\\xy = "foo" :: a -> b -> String
\\xy -> readFile "any.txt" :: a -> b -> IO (String)
\\xy = "foo" :: a -> b -> String
甚至\\xy -> readFile "any.txt" :: a -> b -> IO (String)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.