Как определить одну функцию локально внутри другой в моей версии `reverse` — получение ошибок синтаксического анализа

#haskell

#haskell

Вопрос:

Я начал изучать 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]
  

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

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

 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. Добро пожаловать в Stack Overflow. Я не совсем понимаю ваш вопрос, вам нужна обратная функция, которая принимает только один аргумент? В чем именно ваша проблема?

2. я просто создаю обратную функцию, в настоящее время вызываю test (x, y), НО эта функция принимает 2 аргумента, причем y должен быть NULL list, и хочу создать функцию, для которой нужен только один аргумент, второй, обратный (x), но этот, в зависимости от test (x, y) и в настоящее время у меня есть 2 функции test и inverse, и я хочу провести локальное тестирование на inverse

3. наконец, когда все будет сделано, я хочу, чтобы этот ответ был обратным ([4,2,1]> [1,2,4] test ([4,2,1],[]) > функция проверки ошибок не существует (потому что она локально создается На обратном

4. Я предлагаю вам отказаться от привычки заключать списки аргументов в круглые скобки. inverse x и inverse(x) по сути одно и то же, но test x y и test(x,y) очень отличаются. Haskell не использует круглые скобки для определения списков параметров или для вызова функций.

Ответ №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)
  

Комментарии:

1. Спасибо, вы мне очень поможете!