如何定义函数的类型签名?

时间:2017-11-30 07:12:35

标签: haskell type-signature

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。如果我说对了,我该怎么写"?"

2 个答案:

答案 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演示:

_