Есть ли способ проверить все эти методы без дублирования кода и свойств быстрой проверки?
Почему бы не написать реквизит, чтобы он занимал список функций, а затем проверять каждую из них? Тогда вы запустите его как quickCheck (myProp [myLast, myLast', myLast''])
.
edit: Я боялся, что вы могли бы спросить: P Чтобы сделать это, как я сказал выше, myProp
должен взять список функций, каждый из которых имеет тот же тип, что и last
, и вернуть логическое значение:
myProp :: [([a] -> a)] -> Bool
Но теперь, когда я смотрю на это, возможно, было бы лучше (и более похоже на ваш первоначальный подход), чтобы он также взял список и элемент, поэтому я думаю, что вместо этого я сделаю это:
myProp :: [([a] -> a)] -> [a] -> a -> Bool
Если список пуст, тогда мы возвращаем true:
myProp [] _ _ = True
Если нет, то мы проверяем, выполняется ли свойство для первой функции в списке, а затем рекурсивно проверяем остальную часть списка:
myProp [f:fs] xs x = f (xs ++ [x]) == x && myProp fs xs x
(Я не уверен, почему вы написали x::String
в своей реализации. Не думаю, что вам это нужно - last
работает со списками чего угодно, а не только со списками строк. Но я не на самом деле проверил это, так что я полагаю, у вас была веская причина.)
Во всяком случае, я думаю, что это должно работать, но я на самом деле не пробовал. Пожалуйста, не стесняйтесь редактировать и исправлять любые глупые синтаксические ошибки, которые я, возможно, сделал или что-то в этом роде.