重複の可能性:
(a、a)をファンクターにする
私はクイックソートの次の実装を書きました:
import Data.List (partition)
quicksort [] = []
quicksort (x:xs) =
let (smaller, notSmaller) = partition (< x) xs
in quicksort smaller ++ x : quicksort notSmaller
次に、リストペアにquicksort
適用して、への2つの再帰呼び出しを省略したいと思いました。fmap
quicksort (x:xs) =
let (smaller, notSmaller) = fmap quicksort $ partition (< x) xs
in smaller ++ x : notSmaller
しかし、どうやら、(a, a)
ファンクターではありません。何故ですか?私は1つを提供しようとしました:
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
ですか?それとも、型システムは十分に表現力がありませんか?