Ошибка «без экземпляра» при импорте пользовательского модуля в ghci - PullRequest
1 голос
/ 19 октября 2019

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

Main.hs

module Main where

import Newton (my_sqrt)

main = my_sqrt 25

Newton.hs

module Newton where

deriv f x = (f(x + dx) - f(x))/dx
    where dx = 0.0001


newton f = until satis improve
    where   satis y = abs(f y) < eps
            eps = 0.0001
            improve y = y - (f y/deriv f y)


my_sqrt x = newton f x
    where f y = y^2 - x

my_cubrt x = newton f x
    where f y = y**3 - x

Я пытаюсь загрузить их в ghci, используя

:l Main.hs

Я получаю эту ошибку

Main.hs:9:8: error:
    • No instance for (Fractional (IO t0))
        arising from a use of ‘my_sqrt’
    • In the expression: my_sqrt 25
      In an equation for ‘main’: main = my_sqrt 25

Main.hs:9:16: error:
    • No instance for (Num (IO t0)) arising from the literal ‘25’
    • In the first argument of ‘my_sqrt’, namely ‘25’
      In the expression: my_sqrt 25
      In an equation for ‘main’: main = my_sqrt 25
Failed, modules loaded: Newton.

Как мне решить эту проблему?

1 Ответ

2 голосов
/ 19 октября 2019

Тип main должен быть IO ().

Тип sqrt 25, по-видимому, Fractional t => t (действительно рекомендуется всегда включать сигнатуры типа для вашей верхнейобъекты уровня в программе; вы их пропускаете).

Чтобы согласовать два, вы можете определить, например,

main :: IO ()
main = print (sqrt 25)

, потому что тип print равен print :: Show a => a -> IO ().

...