Я начал изучать Haskell и пытаюсь написать «обратную» функцию. Я создал для этого 2 функции, и они работают, но теперь я хочу определить одну локально внутри второй, но получаю синтаксические ошибки. Вот что я делаю:

let liste1 = [4,2,8,1,7,12]  
-- I create a random list

test(x,y)= if x==[] then y else test(tail(x),head(x):y) 
-- take a 2 list, with y=[] to have a list memory

inverse(x)=test(x,[]) 
-- and finally, to have only 1 parameter

А затем у нас есть:

> inverse(liste1)
[12,7,1,8,2,4]

Это работает! Удивительный!

Теперь я хочу протестировать функцию ЛОКАЛЬНАЯ . Это то, что я пробовал до сих пор:

inverse(x) = let test(x,[]) in if x==[] then y else test(tail(x),head(x):y)

А также

inverse(x) = let  if x==[] then y else test(tail(x),head(x):y) in test(x,[])

Оба способа не работают, и я получаю следующую ошибку: parse error on input ìn'

Я знаю, что это основной вопрос и более простое решение, но я не понимаю ... Помогите мне, пожалуйста!

1
Quentin Doniczka 3 Апр 2019 в 17:05

1 ответ

Лучший ответ

При добавлении определений с помощью let вы хотите поместить свое определение между let и in.

inverse(x) =
  let test(x,y) = if x==[] then y else test(tail(x),head(x):y) 
  in  test(x,[])

Вместо этого вы можете использовать where, чтобы потом дать определение:

inverse(x) = test(x,[])
  where test(x,y) = if x==[] then y else test(tail(x),head(x):y)
2
rampion 3 Апр 2019 в 14:21