#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. Спасибо, вы мне очень поможете!