2016-03-14 1 views
0

Я пытаюсь сделать этоКак создать массив с полиморфными данными?

data Foo a = Foo a 
data FooWrapper = FooWrapper (forall a. Foo a) 

foo = [FooWrapper (Foo 0), FooWrapper (Foo "")] 

Но есть ошибка

не могли совпадать с типом

Int 

с типом

a0 
+0

Что вы пытаетесь сделать? Я спрашиваю, потому что массив с элементами разных типов не будет очень полезен без какого-либо ограничения на типы элементов. Обычно это считается анти-шаблоном в Haskell. –

+0

'data Foo ab = Foo ab'' foo1 :: Foo Int String' 'foo2 :: Foo Int Int' Я что создать функцию, которая могла бы работать с массивом Foo, даже если их второй параметр имеет разные типы' doSomething [ foo1, foo2] ', потому что функция использует только первый параметр. – ais

ответ

1

Экзистенциальные типы не совсем одинаковы в PureScript, как в Haskell, поэтому мы обычно используем библиотеку purescript-exists для такого рода вещей.

Эквивалент использование Exists будет:

import Data.Exists (Exists(), mkExists) 

data Foo a = Foo a 
data FooWrapper = FooWrapper (Exists Foo) 

foo = [FooWrapper (mkExists (Foo 0)), FooWrapper (mkExists (Foo ""))] 

Я полагаю, в этом случае вы, вероятно, не нужно FooWrapper на все и можете просто массив Exists Foo.

+0

Можно ли использовать ограничения типа класса с помощью 'Exists'? 'data FooWrapper = FooWrapper (forall a. Показать a => Foo a)' Например, как я могу получить '[" 0 "," "] :: Array String' из' [(mkExists (Foo 0)), (mkExists (Foo ""))] '? – ais

+0

Да, вам нужно как-то добавить словарь в оболочку. Альтернативой является кодирование экзистенциального типа с использованием 'forall', например. 'type SomeShow = forall r. (forall a. Показать a => a -> r) -> r'. –

+0

@PhilFreeman Не могли бы вы показать полный код 'getStrings' http://stackoverflow.com/questions/36006483/how-to-use-type-constrains-with-exists? – ais

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