Haskell Создать и вернуть переменную - PullRequest
3 голосов
/ 18 апреля 2020

Я новичок в Haskell и у меня есть небольшая проблема с созданием и возвращением переменной.

На самом деле моя проблема - создать переменную в области действия функции и вернуть ее. Сейчас я объявляю пустую переменную в объявлении функции, и функция возвращает ее.

Например, я хочу вернуть квадрат root i для nb. Поскольку я не знаю, как создать переменную i в области видимости, я называю mySqr с хорошим nb и будущим квадратом root i пусто.

mySqr :: Int -> Int -> Int
mySqr nb i
    | i * i == nb = i
    | otherwise = mySqr nb (i + 1)

call: mySqr 25 0

Это работает, но я бы хотел, чтобы оно было лучше.

Спасибо за вашу помощь.

1 Ответ

6 голосов
/ 18 апреля 2020

Обычно создается локальная функция, часто этой функции присваивается имя go:

mySqr :: Int -> <b>Maybe</b> Int
mySqr n = <b>go 0</b>
    where <b>go</b> i | i2 > n = Nothing
               | i2 == n = Just i
               | otherwise = go (i+1)
               where i2 = i*i

Здесь мы возвращаем Maybe Int, то есть Nothing, если квадрат не существует root , Мы знаем, что квадрат root не существует, если i 2 > n , поскольку мы увеличиваем только i . Если мы найдем квадрат root, мы вернем его здесь, завернутый в Just конструктор данных. Например:

Prelude> mySqr 0
Just 0
Prelude> mySqr 1
Just 1
Prelude> mySqr 2
Nothing
Prelude> mySqr 3
Nothing
Prelude> mySqr 4
Just 2

Конечно, есть более быстрые способы вычисления квадрата root. Я оставляю это как упражнение.

...