Haskell: Можно ли определить тип данных, который может инкапсулировать Maybe, String & Double со способностью применять значение соответственно? - PullRequest
0 голосов
/ 29 ноября 2018

Я новичок в Haskell, и при создании простого проекта я столкнулся с этой странной проблемой.

У меня есть список функций, например

[f1, f2, f3 ... fn] 

, который не работает, потому чтоу них нет того же типа.У некоторых есть Ct -> String, Ct -> Double и Ct -> Maybe Double

. Я хотел применить только такие функции

[f1, f2, f3 ... fn] <*> [v1, v2, v3 ... vn] 

, где все v имеют одинаковый тип Ct

Эту проблему легко решить, просто используя списки с такими кортежами, как

[(f1 a, f2 a, f3 a ... fn a) | a <- [v1, v2, v3 ... vn]]

, которые будут выглядеть примерно так:

[ (f1 v1, f2 v1, f3 v1, f4, v1 ... fn v1)

, (f2 v1, f2 v2, f3 v2, f4 v2 ... fn v2)

, ...

, (fn v1, fn v2, fn v3, fn v4 ... fn vn)

]

, но n - это довольно большое число, где вам нужно определить отдельный экземпляр шоу, чтобы напечатать их на терминале, что я и хочу сделать.

Я знаю несколько способовПреодолеть эту проблему можно, используя кортежи, но разделяя результаты на более мелкие порции, но мне было интересно, есть ли способ определения типа данных, который может инкапсулировать несколько типов данных и при этом сохранять «идиоматичность» и читаемый код прикладного стиля?

1 Ответ

0 голосов
/ 29 ноября 2018

Составьте три списка типов [Ct -> String], [Ct -> Double] и [Ct -> Maybe Double].Каждое из них может быть применено к вашему [Ct] соответственно.

На ум приходят два альтернативных решения, которые сразу отбрасываются: новый тип данных, который может содержать любой из String, Double или Maybe Double;или экзистенциалы, которые по сути являются просто более однородной упаковкой одной и той же идеи.Представьте, что выглядело бы так:

data Weird
    = It'sAString String
    | It'sADouble Double
    | It'sAMaybe (Maybe Double)

Затем вы должны использовать, например, [It'sAString . f1, It'sADouble . f2, It'sAMaybe . f3], который имеет тип [Ct -> Weird] и может использоваться аппликативно.Мне уже кажется, что это больше оборудования, чем оно того стоит, особенно если учесть, что теперь ваши потребители должны быть готовы обработать любой из этих трех конструкторов.или создать) класс, который охватывает все вещи, которые вы можете захотеть сделать с String, Double или Maybe Double, и который сначала разумно объединяет все три типа.Уч.Слишком много вещей, которые вы могли бы сделать, чтобы это имело смысл.

...