超级基本问题 - 但我似乎无法得到明确答案。以下功能不会编译:
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]’"
答案 0 :(得分:7)
不完全。您的函数签名表示: 适用于所有 类型a
和b
,如果给出两个类型,则randomfunc将返回b
类型的内容输入a
。
但是,randomFunc
会返回String
([Char]
)。由于您将e1
与2
相互比较,因此您无法使用所有 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
类型签名声称您的函数适用于调用者向您抛出的任何类型{"对于所有")类型a
和b
。但这不适用于您的功能,因为它仅适用于Int
和String
。
您需要更具体地说明您的类型:
randomfunc :: Int -> Int -> String
另一方面,也许您打算让编译器自动为您填写a
和b
,而不是声称它适用于所有a
和{ {1}}。在这种情况下,您真正需要的是PartialTypeSignatures功能:
b