在Haskell中求平方的类型(f(gx))

在Haskell中求平方的类型(f(gx)),haskell,Haskell,您好,我在查找square(f(gx))的类型时遇到问题。这是我的 square :: Int -> Int {x : b} |- g x :: (b -> c) -> c f :: (((b -> c) -> c) -> d) -> d 我有点困惑,如果它是正确的,现在怎么办d必须是Int以及整个表达式((b->c)->c)->d)但我觉得我在这里做错了什么…你在某种程度上过于笼统了,我不太明白 如果您正在声明x::b,那么如果您可以将g应用于x,g

您好,我在查找square(f(gx))的类型时遇到问题。这是我的

square :: Int -> Int
{x : b} |- g x :: (b -> c) -> c
f :: (((b -> c) -> c) -> d) -> d

我有点困惑,如果它是正确的,现在怎么办
d
必须是
Int
以及整个表达式
((b->c)->c)->d)
但我觉得我在这里做错了什么…

你在某种程度上过于笼统了,我不太明白

如果您正在声明
x::b
,那么如果您可以将
g
应用于
x
g::b->c
用于某些类型的
c

类似地,由于可以将
f
应用于
gx
,因此对于某些类型
d
,可以应用
f::c->d
;它的参数类型必须与
g
的返回类型相同

最后,您知道
square::Int->Int
,您可以将
square
应用于
f
的返回值。这意味着通过将
f
的返回类型与
square
的参数类型统一起来,
f::c->Int

不过,这是你所能做到的:

square :: Int -> Int
f :: c -> Int
g :: b -> c
x :: b

然后你就知道
gx::c
f(gx)::Int
,意思是
正方形(f(gx))::Int

你从哪里得到
f
的类型?对于
gx
类型,同样的问题。还有,你为什么要看这两个呢?如果您只想知道
square(f(gx))
的类型,并且您已经知道
square::Int->Int
,那么
square(f(gx))
必须是
Int
假设所有类型都进行了类型检查,而不管
f
g
x
的类型是什么(最通用的类型)不仅仅是结果的类型表达式的最通用类型是
Int
@heisenberg7584在几乎所有现代类型系统中,整个表达式的类型没有其结果的类型那么通用。