Ответ 1
Для n
, чтобы быть естественным преобразованием в Haskell, он должен подчиняться (для всех f
)
(fmap f) . n == n . (fmap f)
Это не относится к Set.toList
.
fmap (const 0) . Set.toList $ Set.fromList [1, 2, 3] = [0, 0, 0]
Set.toList . Set.map (const 0) $ Set.fromList [1, 2, 3] = [0]
Вместо этого он подчиняется другому набору законов. Существует другое преобразование n'
назад, так что выполняется следующее:
n' . (fmap f) . n == fmap f
Если мы выберем f = id
и применим закон функтора fmap id == id
, мы увидим, что это означает, что n' . n == id
и, следовательно, мы имеем аналогичную формулу:
(fmap f) . n' . n == n' . (fmap f) . n == n' . n . (fmap f)
n = Set.toList
и n' = Set.fromList
подчиняются этому закону.
Set.map (const 0) . Set.fromList . Set.toList $ Set.fromList [1, 2, 3] = fromList [0]
Set.fromList . fmap (const 0) . Set.toList $ Set.fromList [1, 2, 3] = fromList [0]
Set.fromList . Set.toList . Set.map (const 0) $ Set.fromList [1, 2, 3] = fromList [0]
Я не знаю, что мы можем назвать этим, кроме того, что Set
является классом эквивалентности списков. Set.toList
находит представительный член класса эквивалентности, а Set.fromList
- частное.
Вероятно, стоит отметить, что Set.fromList
является естественным преобразованием. По крайней мере, он находится в разумной подкатегории Hask, где a == b
подразумевает f a == f b
(здесь ==
является равенством из Eq
). Это также подкатегория Hask, где Set
- функтор; он исключает такие дегенеративные вещи.
leftaroundabout также указал, что Set.toList
является естественным преобразованием в подкатегории Hask, где морфизмы ограничены инъективные функции, где f a == f b
подразумевает a == b
.