基本的Haskell函数类型?

时间:2016-09-18 10:00:12

标签: haskell

超级基本问题 - 但我似乎无法得到明确答案。以下功能不会编译:

randomfunc :: a -> a -> b
randomfunc e1 e2
   | e1 > 2 && e2 > 2       = "Both greater"
   | otherwise              = "Not both greater"

main = do
   let x = randomfunc 2 1
   putStrLn $ show x

我很困惑为什么这不会起作用。这两个参数都是' a' (Ints)和返回参数是' b' (串)?

错误:

"Couldn't match expected type ‘b’ with actual type ‘[Char]’"

2 个答案:

答案 0 :(得分:7)

不完全。您的函数签名表示: 适用于所有 类型ab,如果给出两个类型,则randomfunc将返回b类型的内容输入a

但是,randomFunc会返回String[Char])。由于您将e12相互比较,因此您无法使用所有 a,只能使用{{1} }}:

>

请注意,(>) :: Ord a => a -> a -> Bool 还需要一种方法从e1 > 2创建这样的a

2

因此要么使用特定类型,要么确保正确处理所有这些约束:

(> 2) :: (Num a, Ord a) => a -> Bool

答案 1 :(得分:2)

  

这两个参数都是' a' (Ints)和返回参数是' b' (字符串)?

在Haskell类型签名中,当您编写以小写字母开头的名称(例如a)时,编译器会隐式地将forall a.添加到类型的开头。所以,这就是编译器实际看到的内容:

randomfunc :: forall a b. a -> a -> b

类型签名声称您的函数适用于调用者向您抛出的任何类型{"对于所有")类型ab。但这不适用于您的功能,因为它仅适用于IntString

您需要更具体地说明您的类型:

randomfunc :: Int -> Int -> String

另一方面,也许您打算让编译器自动为您填写ab,而不是声称它适用于所有a和{ {1}}。在这种情况下,您真正​​需要的是PartialTypeSignatures功能:

b