可能的重复:
使 (a, a) 成为函子
我编写了以下快速排序的实现:
import Data.List (partition)
quicksort [] = []
quicksort (x:xs) =
let (smaller, notSmaller) = partition (< x) xs
in quicksort smaller ++ x : quicksort notSmaller
然后我想quicksort
通过应用于fmap
列表对来缩写两个递归调用:
quicksort (x:xs) =
let (smaller, notSmaller) = fmap quicksort $ partition (< x) xs
in smaller ++ x : notSmaller
但显然,(a, a)
不是函子。这是为什么?我试图提供一个:
instance Functor (a, a) where
fmap f (x, y) = (f x, f y)
但是 ghci 不喜欢我的尝试:
Kind mis-match
The first argument of `Functor' should have kind `* -> *',
but `(a, a)' has kind `*'
In the instance declaration for `Functor (a, a)'
谁能向我解释这个错误?我尝试了各种“修复”,但都没有奏效。
是否可以创建(a, a)
一个实例Functor
?还是类型系统不够表达?