В основном вы хотите сгенерировать список записей, а затем распечатать их.
Начнем с записей. Они состоят из двух целых чисел и их произведения. Итак, давайте определим синоним типа для хранения двух целых чисел
type Entry = (Integer, Integer)
и оценочную функцию, которая вычисляет произведение этих чисел,
eval :: Entry -> Integer
eval = uncurry (*)
Затем мы определим функцию для генерации записей:
gen :: Integer -> [Entry]
gen n = [(i, j) | i <- [1 .. n], j <- [i .. n]]
Например:
> gen 4
[(1,1),(1,2),(1,3),(1,4),(2,2),(2,3),(2,4),(3,3),(3,4),(4,4)]
Далее, мы должны быть в состоянии напечатать запись:
showEntry :: Entry -> String
showEntry [email protected](i, j) = show i ++ "*" ++ show j ++ "=" ++ show (eval e)
Например:
> showEntry (2, 3)
"2*3=6"
Наконец, давайте склеить эти куски вместе:
multab :: Integer -> [String]
multab = map showEntry . gen
Здесь мы идем :
> multab 4
["1*1=1","1*2=2","1*3=3","1*4=4","2*2=4","2*3=6","2*4=8","3*3=9","3*4=12","4*4=16"]
Что вы подразумеваете под monad-list? Вы должны использовать control.Monad.List? –
Я не хочу использовать какой-либо конкретный monadList здесь. Просто пытаюсь построить это fucntion с любым monad-List, btw я не уверен, как я могу использовать код с Contol-list! – user1516831
Зачем беспокоиться о монадах? 'mulTab n = [printf"% d *% d =% d "i j (i * j) | i <- [1..n], j <- [1..n]] ' – augustss