quinta-feira, junho 23, 2005

Como se faz em Caml...

tenho andado a estudar Caml para me poder preparar condignamente para o exame da disciplina de PFL no próximo dia 14 de Julho, encontrei um resumo introdutório interessante que estou a seguir para conseguir retomar os conceitos desta linguagem, que, por pouco uso que tenha, preciso de saber para passar no exame. Deparei-me com um exercício interessante em que pede como calcular a hipotenusa de um triângulo rectângulo tomando as medidas dos catetos, de acordo com o teorema de Pitágoras: h= sqrt(a^2+b^2), sendo sqrt a raíz quadrada e ^2 elevado ao quadrado. O que é certo em que Caml não consigo criar uma função que faça isto, já tentei:

let hip_length = fun (a,b) -> sqrt (sqr a +. sqr b);;

O problema é que em CAML a função sqrt só aceita float's como argumentos, e depois outro problema é que sqr (elevado ao quadrado) só aceita int's e devolve int's, e estou a usar o operador +. que serve para somar float's, mas como o sqr só devolve int's, nao posso usar +., mas depois o sqrt so quer float's. E o problema é ? E isto é ridículo, porque pelos vistos o CAML não converte inteiros para float's automaticamente, como no C, usando um cast. Experimentei a função float_of_int, mas aquela espelunca continua a dar erro!
E eu não sei para que raio é que precisa desta #%?[]&%$# de linguagem, só serve mesmo para irritar um gajo e obrigar no pior dos casos, ficar mais um ano a pagar propinas!

Lá resolvi o malfadado problema, descobri que o Caml afinal não tem função sqr! Tive que definir manualmente usando a*a e b*b e depois, sim, a partir da soma, é que faço a conversão para float usando a função float_of_int, de forma que o código no final fica com o seguinte aspecto:

let hip_length = fun a b -> sqrt (float_of_int(a*a + b*b));;

Os parêntesis em volta do float_of_int são necessários visto por que senão nada funciona depois!!!

Sem comentários: