Если так, почему?
C имеет, не мультивыравниваются/маркируют повреждение, и не все потоки управления может быть легко смоделирован с примитивами повторения и решения C. gotos имеют большое значение для возмещения этих дефектов.
Иногда это более ясно использовать переменную флага некоторого вида для осуществления своего рода псевдомногоуровневого повреждения, но это не всегда выше goto (по крайней мере, goto позволяет тому легко определять, куда управление переходит в, в отличие от переменной флага), и иногда Вы просто не хотите платить цену производительности искривлений флагов/других для предотвращения goto.
libavcodec является чувствительной к производительности частью кода. Прямое выражение потока управления является, вероятно, приоритетом, потому что это будет иметь тенденцию работать лучше.
:
- оператор добавления:
x : xs
Возвращает список, в котором первым элементом x
являются все элементы в xs
. В других функциональных языках это обычно называется cons
, потому что оно «cons» рекурсивно сокращает список путем повторения приложения из пустого списка:
1 : 2 : 3 : 4 : []
- это список [1, 2, 3, 4]
.
С точки зрения дизайна, мне нравится идея возврата
'a list option
, где, например,
None // it did not match
Some[] // matched, input had 0 wildcards
Some["foo";"bar"] // matched, input has 2 wildcards, "foo" matched 1st, "bar" 2nd
То есть просто гарантировать, что при возврате Some, длина списка равно количеству подстановочных знаков, а элементы списка соответствуют по порядку. Мне кажется, это просто реализовать, а также разумно для клиентского кода использовать / потреблять.
(Я не понимаю, есть ли в вашем длинном посте более глубокий вопрос.)
Похоже, забавный материал!
] РЕДАКТИРОВАТЬ
Вот обновленный код. Моя интуиция подсказывает мне, что это не все правильно, но, по крайней мере, это работает на ваших примерах. Ключевым моментом является использование
'a list list option
, поскольку «a - это символ, а» список подобен строке, а нам нужен список строк. singleMatch запускает новый список строк, тогда как longMatch занимает начало текущей строки.
Оператор: в Haskell является конструктором списков. Он «объединяет» все, что стоит перед двоеточием, в список, указанный после него.
Например, список целых чисел создается путем «включения» каждого числа в пустой список, например:
Список [ 1,2,3,4]
может быть построено следующим образом:
4: []
(состоит из 4 в пустой список) 3: [4]
(состоит из 3 в список, содержащий 4) 2: [ 3,4]
(составляет 2 в списке, содержащем 3, 4) 1: [2,3,4]
(занимает 1 в списке, содержащем 2,3,4) дает вы;
[1,2,3,4]
Написано полностью,
1 : 2 : 3 : 4 : []
Это конструктор типов для списков. Он не отличается от любого другого конструктора типов, например Just
или Left
, за исключением того, что это инфиксный. Допустимые конструкторы типов могут быть словами, начинающимися с заглавной буквы, или символами, начинающимися с двоеточия.
Таким образом, вы можете определять конструкторы инфиксов для ваших собственных типов данных. Например:
data MyList a = a :> MyList a
| Empty
в приведенном выше коде мы определяем тип с именем MyList
с двумя конструкторами: первый - это конструктор странного вида :>
, который принимает элемент, а другой ] MyList a
; второй - пустой конструктор Empty
, который эквивалентен []
в собственных списках Haskell.
Приведенное выше эквивалентно:
data MyList a = Cons a (MyList a)
| Empty