@Hugo.mls93,
O teu problema é que a função mod só pode ser utilizada em notação infixa se a utilizares na forma x `mod` y (caso contrário terá que ser mod x y). Isto é daquelas coisas que se aprende desde cedo em Haskell: funções com 2 argumentos podem ser utilizadas como operadores binários se forem escritas entre `` (atenção: não são apóstrofos mas sim acentos graves).
Relativamente ao teu código propriamente dito (corrigido), ainda pode ser muito simplificado.
multiplo :: Int -> Int -> Bool
multiplo m n = m `mod` n == 0
-- alternativamente, podia ter escrito mod na sua forma prefixa
-- multiplo m n = mod m n == 0
Como vens de C, provavelmente ainda estás pouco habituado a pensar em Haskell, mas aqui vai na mesma:
Os argumentos não precisam de ser envolvidos num tuplo (como tinhas (Int, Int)), isso tira-te flexibilidade a longo prazo
Nunca se deve verificar uma expressão booleana e devolver True se ela for verdadeira ou False se ela for falsa. Basta devolver o resultado da própria expressão.
Depois, falaste em «simplificar» devolvendo 0 ou 1. Em que medida é isto uma simplificação? A tua função tem como objectivo responder a uma pergunta: um determinado número m é múltiplo de n? A resposta é, naturalmente, booleana -- sim ou não -- e não um número inteiro.
Relativamente à questão de mostrar "é inteiro" (presumo que queiras dizer antes "é múltiplo"), também não tem interesse fazer parte da tua função. Imagina que eu vou usar a tua função num programa maior, onde verifico milhares de vezes se um determinado número é múltiplo de outro; eu só quero que a tua função me devolva True ou False silenciosamente, não quero que ela imprima no ecrã do utilizador milhares de linhas com o resultado.
Os programas devem ser escritos com uma separação clara entre a lógica (a tua função multiplo) e a sua apresentação (as mensagens que queres que apareçam). A partir do momento em que começas a misturá-las, vais ter muitas dores de cabeça, especialmente em Haskell.
↧