Я думаю, вы пытаетесь сделать слишком много в функции. В действительности, лучше работать с небольшими функциями, каждая из которых решает простую задачу, а затем объединять их в функции, которые также малы, и выполнять (немного) более сложную задачу.
Например, мы можем сделать функция digits :: Int -> [Int]
, которая возвращает список цифр:
digits :: Int -> [Int]
digits x | x >= 10 = r : digits q
| otherwise = [x]
where (q,r) = quotRem x 10
Например:
Prelude> digits 102
[2,0,1]
Затем мы можем отфильтровать эти цифры, чтобы проверить, что цифры не равны нулю (с тех пор она не делится), и что число делится на это ди git:
dividableDigits :: Int -> [Int]
dividableDigits n = filter (\x -> x /= 0 && mod n x == 0) (digits n)
Теперь необходимо подсчитать числа, которые совпадают. Я оставляю это как упражнение.