При изучении Haskell я пытаюсь понять типы преобразователей clojure в Haskell.Синтаксис классов типов и типов классов Haskell rank
{-# LANGUAGE RankNTypes #-}
module Transducers where
-- r = reduced
type Reducer r a = r -> a -> r
type Transducer a b = forall r . Reducer r a -> Reducer r b
У меня возникли проблемы с пониманием, как ввести следующую функцию:
-- type inference
transduce :: Foldable t => (t1 -> b -> a -> b) -> t1 -> b -> t a -> b
-- what I actually want
transduce :: forall t1 . Foldable t => Transducer a b -> t1 -> b -> t a -> b
transduce xform f init coll = foldl (xform f) init coll
Это дает мне неприятности, он не будет компилировать. Я что-то пропустил по синтаксису? Или это невозможно?
Можете ли вы дать более полный пример того, что вы пытаетесь сделать? Почему бы просто не трансформировать: Складываемый t => Преобразователь a b -> Редуктор r a -> r -> t b -> r'? – shang
Очевидно, что тип 'Foldable t => Transducer a b -> t1 -> b -> t a -> b' является неправильным для данной реализации. 'xform' имеет тип' Transducer ab', который является функцией, использующей 'Reducer r0 a' для некоторого' r0', но вы применяете 'xform' к' f', который имеет тип 't1' (жесткий тип!), который очевидно, не имеет смысла. Выведенный тип 'Foldable t => (t1 -> b -> a -> b) -> t1 -> b -> ta -> b' - это то, что вы на самом деле хотите - первый аргумент не является преобразователем, но вы можете передать что-то, что является преобразователем. Если вы хотите сделать вывод о политипах, оберните «Преобразователь» в новый тип. – user2407038