什么时候使用类型类?

use*_*428 2 haskell

通常当我创建函数时,我不知道在哪些函数中使用类型类(等等)更好Eq,Integral因为有时候不需要像以下那样使用它们:

factorial :: Int -> Int 
bla bla bla 
bla bla bla
Run Code Online (Sandbox Code Playgroud)

factorial :: (Integral a) => a -> a
bla bla bla
bla bla bla
Run Code Online (Sandbox Code Playgroud)

我相信第二个只是花时间和地点但是在elem函数中写入是很重要的Eq(下面ellemeelem)

elemme :: Eq a => a -> [a] -> Bool
y `elemme` [] = False
y `elemme` (x:xs) = if y == x then True else y `elemme` xs 
Run Code Online (Sandbox Code Playgroud)

请告诉我一些事情.谢谢.

Dan*_*zer 9

类型类可以让你编写更多通用函数.Haskell有很棒的工具可以让你指定一个函数适用于所有类型,比如

id :: a -> a
id a = a
Run Code Online (Sandbox Code Playgroud)

但有些事情并不适用于所有类型,

(==) :: Eq a => a -> a -> Bool
Run Code Online (Sandbox Code Playgroud)

没有类型类,我们要么必须==为每种类型写一个新的,

eqInteger :: Integer -> Integer -> Bool
Run Code Online (Sandbox Code Playgroud)

或者指定所有类型都是等同的,并且可以测试是否相等.但是你可以问

id == const 1
Run Code Online (Sandbox Code Playgroud)

因此,当您发现自己想要指定函数在所有类型的子集上工作时,请转到类型类.

我经常喜欢编写这些更通用的函数,即使我不使用它们超过一种类型,因为签名越普遍,实现的选项越少,这使我更容易知道我没有做过什么傻傻的

id :: Integer -> Integer
id = (+1)
Run Code Online (Sandbox Code Playgroud)

您基本上声明您的函数只需要X函数,这使得使用错误函数可能会出现编译器错误.