Предположим, у меня есть функция, которая выполняет некоторые вычисления с несколькими шаблонами; реализуется в виде сопоставления с образцом.Предоставляет ли Haskell выражение let для множественных совпадений шаблонов?
Большинство этих шаблонов (наряду с другими вещами, отличными друг от друга) обрабатывают параметр, для которого я использую промежуточную переменную в выражении let
. Но на самом деле я считаю, что на многих шаблонах одинаково let
, и мне интересно, есть ли способ определить let
для нескольких шаблонов?
Вот пример моих дублируются let
:
data MyType a = Something a | Another Int [a]
myFunc (Something x) = -- return something, this isn't the point here
myFunc (Another 0 xs) =
let intermediary = some $ treatment xs
in doSthg intermediary 1
myFunc (Another 1 (x:xs)) =
let intermediary = some $ treatment xs
in doSthg1 intermediary 1 x
myFunc (Another 2 (x:x':xs)) =
let intermediary = some $ treatment xs
in doSthg2 intermediary 2 x x'
Вы можете увидеть, что параметр xs
всегда присутствует, когда я использую его для intermediary
, и это может быть факторизуются. Этого легко достичь с помощью вспомогательной функции, но мне было интересно, возможно ли то, что я прошу, без него. Пожалуйста, постарайтесь сделать его простым для новичков, и я надеюсь, что мой пример достаточно ясен.
Nope! Необходимо использовать отдельную функцию и передать ее как параметр явно, чтобы отменить повторный код. Что касается Haskell, вышеупомянутые вхождения 'xs' - это совершенно разные переменные (потому что они имеют разные сайты привязки). – luqui
Спасибо! Теперь у меня есть другой вопрос: вы предполагали, что третье и четвертое уравнения никогда не совпадают? Потому что 'xs' соответствует любому списку ... Вы изменили порядок уравнений? – yatima2975
Я написал это, чтобы проиллюстрировать, что 'xs 'извлекается из сопоставления шаблонов в нескольких шаблонах, но не всегда имеет одинаковое значение (иначе совпадение шаблонов не будет интересоваться: будет только один шаблон). То, что сделано с ним в этом примере, не важно; но в моем коде 'y' заменяется реальными значениями, поэтому последующие шаблоны совпадают. Но вы снова правы, поэтому я отредактирую его с конкретным типом, чтобы все это стало понятным. –