Разрыв, когда последний di git больше предыдущего di git in haskell - PullRequest
0 голосов
/ 08 марта 2020

Я пишу функцию, которая использует break в Haskell. Эта функция будет разбивать список строк, когда последний символ больше предыдущего. Например: «176» вернется («1», «76»), «1276» вернется («12», «76»). Однако моя функция отлично работает с «1276», но когда на входе «176», он только возвращает («176», «»). Моя функция заключается в следующем. Может кто-нибудь, пожалуйста, помогите мне выяснить, почему? Спасибо.

myBreak (x:y:xs) = break (\x -> x > y ) (x:y:xs)

1 Ответ

1 голос
/ 08 марта 2020

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

myBreak (x:y:xs) = break (\x -> x > y ) (x:y:xs)
            \               \__/   /
             \____________________/

Так что, когда ввод "176", его второй символ '7', а нет символа больше чем '7' во входной строке, поэтому она не останавливается до конца.

Это отвечает на этот вопрос.

Таким образом, ваша функция фактически не выполняет то, что вы хотели, чтобы она делала , Но это другой вопрос, как правильно закодировать эту функцию, который, как мне кажется, уже много раз задавался здесь на SO.


(неправильно прочитал ваш вопрос)

Потому что именно так -в функции break определена для работы.

Его тип

break :: (a -> Bool) -> [a] -> ([a], [a]) 

Вы предоставляете ему предикат (\x -> x > y ) и входной список (x:y:xs), и он возвращает вам пару списков в кортеже, как объявлено :

break, примененный к предикату p и списку xs, возвращает кортеж, в котором первый элемент имеет самый длинный префикс (возможно, пустой) из xs элементов, которые не удовлетворяют p, а второй элемент является остатком списка

, а в вашем последнем случае остаток представляет собой пустой список Char с, т.е. пустая строка "".

используемый вами шаблон (x:y:xs) требует, чтобы во входном списке было как минимум 2 элемента. Поскольку вы не указываете никаких дополнительных уравнений для функции, она завершится с ошибкой, если вызывается с более короткими строками. Вместо этого вы можете использовать xs.

...