Веб Зображення Новини Групи Блоги Перекладач Gmail Ще »
Групи, які ви переглядали нещодавно | Довідка | Увійти
Головна сторінка Груп Google
Newbie question...
Занадто багато тем, що мають бути показані першими. Для того, щоб показати тему першою, зніміть цю опцію з іншої теми.
Під час обробки вашого запиту сталася помилка. Будь ласка, повторіть вашу спробу пізніше.
флаг
  10 повідомлення - Згорнути всі  -  Перекласти все вказаною мовою: Перекладено (переглянути всі оригінали)
Група, до якої ви додаєте допис, - група Usenet. Відтак, будь-хто в Інтернеті бачитиме вашу електронну адресу.
Вашу відповідь не було надіслано.
Ваш допис надіслано
 
Від:
Кому:
Копія:
Продолжить:
Додати копію: | Додати продовження: | Редагувати тему
Тема:
Підтвердження:
З метою підтвердження введіть символи, наведені на зображенні нижче, або числа, які чуєте, натиснувши значок доступу. Прослухайте і введіть цифри, що чуєте
 
Hello,
I've been studying this fascinating language for a few days so I am
pretty new to all this (especially the error messages from the
interpreter!)

I wrote this simple function, which purpose is to generate a list of
proper divisors of a number:

proper_divisors :: Int -> [Int]
proper_divisors n = [d | d <- [1 .. (floor . sqrt) n], mod n d == 0]

Saved in a file, when I :load it from GHCI 6.8.2 this is what I get:

[1 of 1] Compiling Main             ( pd.hs, interpreted )

pd.hs:2:37:
    No instance for (RealFrac Int)
      arising from a use of `floor' at pd.hs:2:37-41
    Possible fix: add an instance declaration for (RealFrac Int)
    In the first argument of `(.)', namely `floor'
    In the expression: (floor . sqrt) n
    In a list comprehension: d <- [1 .. (floor . sqrt) n]

pd.hs:2:45:
    No instance for (Floating Int)
      arising from a use of `sqrt' at pd.hs:2:45-48
    Possible fix: add an instance declaration for (Floating Int)
    In the second argument of `(.)', namely `sqrt'
    In the expression: (floor . sqrt) n
    In a list comprehension: d <- [1 .. (floor . sqrt) n]
Failed, modules loaded: none.

I can imagine that perhaps it has something to do with type conflict
but I can't go any further.
Would someone help?

Thanks,
max(ino)


Ви мусите увійти перед публікацією повідомлень.
Аби надіслати допис, будь ласка, спочатку приєднайтеся до цієї групи.
Будь ласка, поновіть своє прізвисько на сторінці налаштування передплати перед тим, як надіслати свій допис.
У вас немає права надсилання дописів до цієї групи.
Mark T.B. Carroll  
Переглянути профіль   Перекласти вказаною мовою: Перекладено (переглянути оригінал)
 Більше налаштувань 13 Чер, 15:28
Групи новин: comp.lang.haskell
Від: "Mark T.B. Carroll" <Mark.Carr...@Aetion.com>
Дата: Sat, 13 Jun 2009 08:28:15 -0400
Місцевий час: Сб 13 Чер 2009 15:28
Тема: Re: Newbie question...
maxino <max.korob...@gmail.com> writes:

(snip)

> proper_divisors :: Int -> [Int]
> proper_divisors n = [d | d <- [1 .. (floor . sqrt) n], mod n d == 0]
(snip)
>     No instance for (RealFrac Int)
>       arising from a use of `floor' at pd.hs:2:37-41
(snip)
>     No instance for (Floating Int)
>       arising from a use of `sqrt' at pd.hs:2:45-48

the (floor . sqrt) can't accept an n :: Int, because they need n's type
to be instances of Floating and RealFrac, and Int isn't.

Prelude> :type sqrt
sqrt :: (Floating a) => a -> a

... note that the return type is the same as the argument type. From a
commonsense point of view, one can see part of the reason for the
complaint about Int as being that for things like sqrt (2::Int) you
couldn't return an Int answer (at least a correct one!).

Of course,

Prelude> :type mod
mod :: (Integral a) => a -> a -> a

mod expects an integral n, and you already declared n to be Int.

How about,

proper_divisors n = [d | d <- [1 .. (floor . sqrt . fromIntegral) n], mod n d == 0]

By the way, though I actually much prefer your convention, upper and
lower camel case seem to have established themselves as the Haskell way,
so normally one would name your function properDivisors.

Mark


Ви мусите увійти перед публікацією повідомлень.
Аби надіслати допис, будь ласка, спочатку приєднайтеся до цієї групи.
Будь ласка, поновіть своє прізвисько на сторінці налаштування передплати перед тим, як надіслати свій допис.
У вас немає права надсилання дописів до цієї групи.
On Jun 13, 2:28 pm, "Mark T.B. Carroll" <Mark.Carr...@Aetion.com>
wrote:

Hey Mark,
Couldn't have asked for a better explanation.
Sorry for the "newbie-ness".
Grazie!
max(ino)

Ви мусите увійти перед публікацією повідомлень.
Аби надіслати допис, будь ласка, спочатку приєднайтеся до цієї групи.
Будь ласка, поновіть своє прізвисько на сторінці налаштування передплати перед тим, як надіслати свій допис.
У вас немає права надсилання дописів до цієї групи.
Mark T.B. Carroll  
Переглянути профіль   Перекласти вказаною мовою: Перекладено (переглянути оригінал)
 Більше налаштувань 13 Чер, 19:09
Групи новин: comp.lang.haskell
Від: "Mark T.B. Carroll" <Mark.Carr...@Aetion.com>
Дата: Sat, 13 Jun 2009 12:09:15 -0400
Місцевий час: Сб 13 Чер 2009 19:09
Тема: Re: Newbie question...

maxino <max.korob...@gmail.com> writes:
> Sorry for the "newbie-ness".

No problem, that's what we're here for. At least you're trying things
out! Haskell can be quite confusing at first.

Mark


Ви мусите увійти перед публікацією повідомлень.
Аби надіслати допис, будь ласка, спочатку приєднайтеся до цієї групи.
Будь ласка, поновіть своє прізвисько на сторінці налаштування передплати перед тим, як надіслати свій допис.
У вас немає права надсилання дописів до цієї групи.

maxino <max.korob...@gmail.com> writes:
> proper_divisors :: Int -> [Int]
> proper_divisors n = [d | d <- [1 .. (floor . sqrt) n], mod n d == 0]

Aside from the type error that Mark explained, I think the algorithm
isn't right.  Suppose n=10 for example.  The divisors are 2 and 5,
but you'll miss the 5.

Ви мусите увійти перед публікацією повідомлень.
Аби надіслати допис, будь ласка, спочатку приєднайтеся до цієї групи.
Будь ласка, поновіть своє прізвисько на сторінці налаштування передплати перед тим, як надіслати свій допис.
У вас немає права надсилання дописів до цієї групи.
On Jun 13, 7:01 pm, Paul Rubin <http://phr...@NOSPAM.invalid> wrote:

> maxino <max.korob...@gmail.com> writes:
> > proper_divisors :: Int -> [Int]
> > proper_divisors n = [d | d <- [1 .. (floor . sqrt) n], mod n d == 0]

> Aside from the type error that Mark explained, I think the algorithm
> isn't right.  Suppose n=10 for example.  The divisors are 2 and 5,
> but you'll miss the 5.

Yes, I just realized it :-)
Should be simply floor (n / 2) instead of (floor.sqrt) n.

max(ino)


Ви мусите увійти перед публікацією повідомлень.
Аби надіслати допис, будь ласка, спочатку приєднайтеся до цієї групи.
Будь ласка, поновіть своє прізвисько на сторінці налаштування передплати перед тим, як надіслати свій допис.
У вас немає права надсилання дописів до цієї групи.

maxino <max.korob...@gmail.com> writes:
> Yes, I just realized it :-)
> Should be simply floor (n / 2) instead of (floor.sqrt) n.

That's not so good either, you don't really want to divide all the way
up to n/2.  I'll leave the right answer as an exercise but think of
using one of the "fold" functions or recursing on n/d when you find
a divisor.

Ви мусите увійти перед публікацією повідомлень.
Аби надіслати допис, будь ласка, спочатку приєднайтеся до цієї групи.
Будь ласка, поновіть своє прізвисько на сторінці налаштування передплати перед тим, як надіслати свій допис.
У вас немає права надсилання дописів до цієї групи.
Dirk Thierbach  
Переглянути профіль   Перекласти вказаною мовою: Перекладено (переглянути оригінал)
 Більше налаштувань 13 Чер, 20:51
Групи новин: comp.lang.haskell
Від: Dirk Thierbach <dthierb...@usenet.arcornews.de>
Дата: Sat, 13 Jun 2009 19:51:46 +0200
Місцевий час: Сб 13 Чер 2009 20:51
Тема: Re: Newbie question...

maxino <max.korob...@gmail.com> wrote:
> On Jun 13, 7:01 pm, Paul Rubin <http://phr...@NOSPAM.invalid> wrote:
>> maxino <max.korob...@gmail.com> writes:
>> > proper_divisors :: Int -> [Int]
>> > proper_divisors n = [d | d <- [1 .. (floor . sqrt) n], mod n d == 0]
>> Aside from the type error that Mark explained, I think the algorithm
>> isn't right.  Suppose n=10 for example.  The divisors are 2 and 5,
>> but you'll miss the 5.
> Yes, I just realized it :-)
> Should be simply floor (n / 2) instead of (floor.sqrt) n.

Then you could just use   div n 2    or   n `div` 2   with infix notation.
No need to convert to floating point and back.

Project Euler? :-)

- Dirk


Ви мусите увійти перед публікацією повідомлень.
Аби надіслати допис, будь ласка, спочатку приєднайтеся до цієї групи.
Будь ласка, поновіть своє прізвисько на сторінці налаштування передплати перед тим, як надіслати свій допис.
У вас немає права надсилання дописів до цієї групи.
On Jun 13, 7:51 pm, Dirk Thierbach <dthierb...@usenet.arcornews.de>
wrote:

Guilty as charged :-)
I did a good number of problems in Python and now I am trying to do
them again in Haskell... I am fascinated by this language but for me
the learning curve is almost... "vertical" :-)))

Cheers,
max(ino)


Ви мусите увійти перед публікацією повідомлень.
Аби надіслати допис, будь ласка, спочатку приєднайтеся до цієї групи.
Будь ласка, поновіть своє прізвисько на сторінці налаштування передплати перед тим, як надіслати свій допис.
У вас немає права надсилання дописів до цієї групи.
Dirk Thierbach  
Переглянути профіль   Перекласти вказаною мовою: Перекладено (переглянути оригінал)
 Більше налаштувань 13 Чер, 23:50
Групи новин: comp.lang.haskell
Від: Dirk Thierbach <dthierb...@usenet.arcornews.de>
Дата: Sat, 13 Jun 2009 22:50:35 +0200
Місцевий час: Сб 13 Чер 2009 23:50
Тема: Re: Newbie question...

maxino <max.korob...@gmail.com> wrote:
> On Jun 13, 7:51 pm, Dirk Thierbach <dthierb...@usenet.arcornews.de>
> wrote:
>> Project Euler? :-)
> Guilty as charged :-)

You might be interested in

http://en.wikipedia.org/wiki/Multiplicative_function

> I did a good number of problems in Python and now I am trying to do
> them again in Haskell... I am fascinated by this language but for me
> the learning curve is almost... "vertical" :-)))

Yeah, that's normal. Was for me, too. Project Euler is especially
hard, because not only you have to solve the problem, you have to do
it efficiently. So for learning, I guess it makes the curve even steeper.

Once you're comfortable with writing in purely functional style,
have a look at imperative array updates and the ST-monad. You're
going to need it.

- Dirk


Ви мусите увійти перед публікацією повідомлень.
Аби надіслати допис, будь ласка, спочатку приєднайтеся до цієї групи.
Будь ласка, поновіть своє прізвисько на сторінці налаштування передплати перед тим, як надіслати свій допис.
У вас немає права надсилання дописів до цієї групи.
Кінець повідомлень
« Повернутися до обговорень « Новіша тема     Старіша тема »

Групи Google - Домашня сторінка Google - Правила користування послугою - Заява про конфіденційність і нерозголошення інформації
©2009 Google