Haskell类型声明

Mag*_*nus 3 haskell types

在Haskell中,为什么编译:

splice :: String -> String -> String
splice a b = a ++ b
main = print (splice "hi" "ya")
Run Code Online (Sandbox Code Playgroud)

但这不是:

splice :: (String a) => a -> a -> a
splice a b = a ++ b
main = print (splice "hi" "ya")

>> Type constructor `String' used as a class
Run Code Online (Sandbox Code Playgroud)

我原以为这些都是一样的.有没有办法使用第二种样式,避免重复类型名称3次?

ami*_*dfv 13

=>类型中的语法适用于类型.

当你说f :: (Something a) => a,你并不是说那a 一个Something,你说它是一种"在一组" Something类型.

例如,Num是一种类型类,其包括这样的类型如IntFloat.但是,没有类型Num,所以我不能说

f :: Num -> Num
f x = x + 5
Run Code Online (Sandbox Code Playgroud)

但是,我可以说

f :: Int -> Int
f x = x + 5
Run Code Online (Sandbox Code Playgroud)

要么

f :: (Num a) => a -> a
f x = x + 5
Run Code Online (Sandbox Code Playgroud)