Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
IEnumerable
IEnumerable fmap(Func<T, TResult> f, IEnumerable source)
{
var result = new List();
foreach(var item in source) result.Add(f(item));
return item;
}
NullableNullable fmap(Func<T, TResult> f, Nullable source)
{
if (source.HasValue) return new Nullable(f(source.Value));
return new Nullable();
}
вот вполне себе функторы. Проблема .NET'а в слабой системе типов. Из-за этого само понятие functor(точнее обощенную сигнатуру функции fmap) на C# нельзя выразить.
IEnumerable[T]
IEnumerable[TResult] fmap(Func[T, TResult] f, IEnumerable[T] source)
{
var result = new List[TResult]();
foreach(var item in source) result.Add(f(item));
return item;
}
Nullable[T]
Nullable[TResult] fmap(Func[T, TResult] f, Nullable[T] source)
{
if (source.HasValue) return new Nullable[TResult](f(source.Value));
return new Nullable[TResult]();
}
public static IEnumerable Select<TSource, TResult>(this IEnumerable source,
Func<TSource, TResult> selector)
Сравнить с
fmap :: Functor f => (a -> b) -> f a -> f b
Также это монада, аналогичная list (bind имеет название SelectMany)
А все эти from .... select ... - это подобие do-нотации с непонятными названиями.
trait Functor[F[_]] {
def fmap[A, B](r: F[A], f: A => B): F[B]
}
∗ → ∗. У вас не получится написать instance Functor Either where ... fmap? instance Functor (Either a) – это да. Только это инстанс для типа (Either a) :: ∗ → ∗, а не для типа Either. Когда Вы дали конструктору типа Either один параметр – это уже другой тип, однопараметрический. Так же как и обычные функции, конструкторы в Haskell каррированные, то можно всегда считать, что они имеют один параметр:Either :: ∗ → (∗ → ∗)f ∘ (g ∘ h) ≡ (f ∘ g) ∘ hg ∘ h ≡ id ∷ B → Bf ∘ (g ∘ h) ≡ f ∘ id ≡ ff ∘ g ≡ id ∷ A → A(f ∘ g) ∘ h ≡ id ∘ h ≡ hf, а правая – h, но f ≠ h, т.к. это разные морфизмы (разные стрелки).id. По определению композиции, для любых двух морфизмов с совпадающей областью/кообластью (читай стрелок с общим концом/началом) существует морфизм, называемый их композицией, то есть такая стрелка, что она действует из области первой в кообласть второй:h ∷ B → Ag ∷ A → Bg ∘ h ∷ B → BB в B – это id ∷ B → B, значит она и является этой композицией. Аналогично с композицией f ∘ g.
Категория Hask