doWithFunctionArg :: ? -> Int -> Int -> Int
doWithFunctionArg f a b = f a b
multiply :: Int -> Int -> Int
multiply a b = a * b
main = do
print $ doWithFunctionArg mutiple 7 8
我不确定函数的类型签名是什么。 multiply :: Int -> Int -> Int
是乘法函数的函数类型签名吗?如果是,我如何为函数doWithFunctionArg
编写类型签名? doWithFunctionArg
函数有三个参数," f"是功能类型," a"和" b"是Int
,结果应该是Int
。如果我说对了,我该怎么写"?"
答案 0 :(得分:5)
multiply
的类型为Int -> Int -> Int
,因此doWithFunctionArg
的类型为
-- typeof(multiply) -> Int -> Int -> Int
(Int -> Int -> Int) -> Int -> Int -> Int
实际上你可以打电话给ghci寻求帮助:
Prelude> doWithFunctionArg f a b = f a b
Prelude> :t doWithFunctionArg
doWithFunctionArg :: (t2 -> t1 -> t) -> t2 -> t1 -> t
答案 1 :(得分:2)
正如delta指出的那样,您可以省略类型签名,然后让GHC推断它。
您也可以将类型签名保留在原始位置,并仅使用通配符{
"authId": "eyAidHlwIjogIkpXVCIsGHJhbGciOiAiSFMyNTYiIH0.eyAib3RrIjogImo1Y2gybnFqaGwybGhnZ250cWIzazNkMHFpIiwgInJlYWxtIjogIm89aXRzdXBwb3J0MjQ3ZGF0YXN0b3JlLG91PXNlcnZpY2VzLGRjPW9wZW5hbSxkYz1mb3JnAWEvY2ssZGM9b3JnIiwgInNlc3Npb25JZCI6ICJBUUlDNXdNMkxZNFNmY3h0UUDSFGlielFPYkJuUVUxTTNudUlab3JFdEcxX2liNC4qQUFKVFNRQUNNREVBQWxOTEFCTTRPRGcxTkRRME16STFNRFl3TXpnNE5EUTRBQUpUTVFBQSoiIH0.rWE7A_tjcsyiXpQdAXUsS6OiHi97HhXQEkYwY919ovE",
"template": "",
"stage": "IDMDataStore1",
"header": "Access Your Account",
"callbacks": [
{
"type": "NameCallback",
"output": [
{
"name": "prompt",
"value": "Email ID:"
}
],
"input": [
{
"name": "IDToken1",
"value": "sdf.er@dummy.com"
}
]
},
{
"type": "PasswordCallback",
"output": [
{
"name": "prompt",
"value": "Password:"
}
],
"input": [
{
"name": "IDToken2",
"value": ""
}
]
},
{
"type": "TextOutputCallback",
"output": [
{
"name": "message",
"value": "\n "
},
{
"name": "messageType",
"value": "0"
}
]
}
]
}
替换未知?
。当GHC在类型中遇到_
时,它将尝试仅在类型签名的其余部分的上下文中推断出使用推断类型产生错误。
这是一个GHCi演示:
_