Я пытаюсь сделать этоКак создать массив с полиморфными данными?
data Foo a = Foo a
data FooWrapper = FooWrapper (forall a. Foo a)
foo = [FooWrapper (Foo 0), FooWrapper (Foo "")]
Но есть ошибка
не могли совпадать с типом
Int
с типом
a0
Я пытаюсь сделать этоКак создать массив с полиморфными данными?
data Foo a = Foo a
data FooWrapper = FooWrapper (forall a. Foo a)
foo = [FooWrapper (Foo 0), FooWrapper (Foo "")]
Но есть ошибка
не могли совпадать с типом
Int
с типом
a0
Экзистенциальные типы не совсем одинаковы в 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
.
Можно ли использовать ограничения типа класса с помощью 'Exists'? 'data FooWrapper = FooWrapper (forall a. Показать a => Foo a)' Например, как я могу получить '[" 0 "," "] :: Array String' из' [(mkExists (Foo 0)), (mkExists (Foo ""))] '? – ais
Да, вам нужно как-то добавить словарь в оболочку. Альтернативой является кодирование экзистенциального типа с использованием 'forall', например. 'type SomeShow = forall r. (forall a. Показать a => a -> r) -> r'. –
@PhilFreeman Не могли бы вы показать полный код 'getStrings' http://stackoverflow.com/questions/36006483/how-to-use-type-constrains-with-exists? – ais
Что вы пытаетесь сделать? Я спрашиваю, потому что массив с элементами разных типов не будет очень полезен без какого-либо ограничения на типы элементов. Обычно это считается анти-шаблоном в Haskell. –
'data Foo ab = Foo ab'' foo1 :: Foo Int String' 'foo2 :: Foo Int Int' Я что создать функцию, которая могла бы работать с массивом Foo, даже если их второй параметр имеет разные типы' doSomething [ foo1, foo2] ', потому что функция использует только первый параметр. – ais