2016-09-27 1 views
0

При изучении 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 

Это дает мне неприятности, он не будет компилировать. Я что-то пропустил по синтаксису? Или это невозможно?

+1

Можете ли вы дать более полный пример того, что вы пытаетесь сделать? Почему бы просто не трансформировать: Складываемый t => Преобразователь a b -> Редуктор r a -> r -> t b -> r'? – shang

+1

Очевидно, что тип '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

ответ

1

Она смотрит на меня, как вы, вероятно, имел в виду что-то вроде

transduce :: Foldable t => Transducer a b -> Reducer r a -> r -> t b -> r 

Как user2407038 suggested, вам нужно всего лишь такой фантазии тип, если вы хотите, чтобы заставить абонента на поставку Transducer. В противном случае вы можете упростить его до

transduce :: Foldable t => (x -> Reducer r b) -> x -> r -> t b -> r 
+0

Спасибо, я понимаю сейчас :) – Seneca

 Смежные вопросы

  • Нет связанных вопросов^_^