Send Beginners mailing list submissions to
[email protected]
To subscribe or unsubscribe via the World Wide Web, visit
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
or, via email, send a message with subject or body 'help' to
[email protected]
You can reach the person managing the list at
[email protected]
When replying, please edit your Subject line so it is more specific
than "Re: Contents of Beginners digest..."
Today's Topics:
1. Re: foldr on infinite list to decide prime number (Gesh)
2. Re: foldr on infinite list to decide prime number
(Chul-Woong Yang)
3. Re: foldr on infinite list to decide prime number (derek riemer)
4. Re: foldr with short circuit and accumulator (Chul-Woong Yang)
5. Re: foldr with short circuit and accumulator (Chul-Woong Yang)
6. Re: foldr on infinite list to decide prime number
(Chul-Woong Yang)
----------------------------------------------------------------------
Message: 1
Date: Tue, 02 Feb 2016 15:33:14 +0200
From: Gesh <[email protected]>
To: The Haskell-Beginners Mailing List - Discussion of primarily
beginner-level topics related to Haskell <[email protected]>
Subject: Re: [Haskell-beginners] foldr on infinite list to decide
prime number
Message-ID: <[email protected]>
Content-Type: text/plain; charset=UTF-8
On February 2, 2016 3:36:03 AM GMT+02:00, Chul-Woong Yang
<[email protected]> wrote:
>I feel sorry for posting mis-formatted code.
>I re-post the question.
>--
>
>Hi, all.
>
>While I know that foldr can be used on infinite list to generate
>infinite
>list,
>I'm having difficulty in understaind following code:
>
>isPrime n = n > 1 && -- from haskell wiki
> foldr (\p r -> p*p > n || ((n `rem` p) /= 0 && r)) True primes
>primes = 2 : filter isPrime [3,5..]
>
>primes is a infinite list of prime numbers, and isPrime does foldr to
>get a
>boolean value.
>What causes foldr to terminate folding?
>
>Any helps will be deeply appreciated.
>
>Thank you.
>
>
>2016-02-02 10:32 GMT+09:00 Chul-Woong Yang <[email protected]>:
>
>> Hi, all.
>>
>> While I know that foldr can be used on infinite list to generate
>infinite
>> list,
>> I'm having difficulty in understaind following code:
>>
>> isPrime n = n > 1 && -- from haskell wiki foldr (\p r -> p*p > n ||
>((n
>> `rem` p) /= 0 && r)) True primes primes = 2 : filter isPrime [3,5..]
>>
>> primes is a infinite list of prime numbers, and isPrime does foldr to
>get
>> a boolean value.
>> What causes foldr to terminate folding?
>>
>> Any helps will be deeply appreciated.
>>
>> Thank you.
>>
>> Chul-Woong
>>
>
>
>------------------------------------------------------------------------
>
>_______________________________________________
>Beginners mailing list
>[email protected]
>http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
Note that || is lazy, specifically:
> True || _ = True
> False || x = x
Hence, once foldr reaches a prime larger than sqrt n, the first branch of ||
will be True, short-circuiting the entire infinite computation.
HTH,
Gesh
------------------------------
Message: 2
Date: Wed, 3 Feb 2016 09:36:00 +0900
From: Chul-Woong Yang <[email protected]>
To: The Haskell-Beginners Mailing List - Discussion of primarily
beginner-level topics related to Haskell <[email protected]>
Subject: Re: [Haskell-beginners] foldr on infinite list to decide
prime number
Message-ID:
<CALmycjqAdh9gNVQGZfP3Rj=Be1KTv46UtmGLMjHgnpf0+UQ=k...@mail.gmail.com>
Content-Type: text/plain; charset=UTF-8
Thank you for kind response.
See you in another thread. :-)
2016-02-02 22:33 GMT+09:00 Gesh <[email protected]>:
> On February 2, 2016 3:36:03 AM GMT+02:00, Chul-Woong Yang
> <[email protected]> wrote:
>>I feel sorry for posting mis-formatted code.
>>I re-post the question.
>>--
>>
>>Hi, all.
>>
>>While I know that foldr can be used on infinite list to generate
>>infinite
>>list,
>>I'm having difficulty in understaind following code:
>>
>>isPrime n = n > 1 && -- from haskell wiki
>> foldr (\p r -> p*p > n || ((n `rem` p) /= 0 && r)) True primes
>>primes = 2 : filter isPrime [3,5..]
>>
>>primes is a infinite list of prime numbers, and isPrime does foldr to
>>get a
>>boolean value.
>>What causes foldr to terminate folding?
>>
>>Any helps will be deeply appreciated.
>>
>>Thank you.
>>
>>
>>2016-02-02 10:32 GMT+09:00 Chul-Woong Yang <[email protected]>:
>>
>>> Hi, all.
>>>
>>> While I know that foldr can be used on infinite list to generate
>>infinite
>>> list,
>>> I'm having difficulty in understaind following code:
>>>
>>> isPrime n = n > 1 && -- from haskell wiki foldr (\p r -> p*p > n ||
>>((n
>>> `rem` p) /= 0 && r)) True primes primes = 2 : filter isPrime [3,5..]
>>>
>>> primes is a infinite list of prime numbers, and isPrime does foldr to
>>get
>>> a boolean value.
>>> What causes foldr to terminate folding?
>>>
>>> Any helps will be deeply appreciated.
>>>
>>> Thank you.
>>>
>>> Chul-Woong
>>>
>>
>>
>>------------------------------------------------------------------------
>>
>>_______________________________________________
>>Beginners mailing list
>>[email protected]
>>http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>
> Note that || is lazy, specifically:
>> True || _ = True
>> False || x = x
> Hence, once foldr reaches a prime larger than sqrt n, the first branch of ||
> will be True, short-circuiting the entire infinite computation.
>
> HTH,
> Gesh
> _______________________________________________
> Beginners mailing list
> [email protected]
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
------------------------------
Message: 3
Date: Tue, 2 Feb 2016 17:52:08 -0700
From: derek riemer <[email protected]>
To: The Haskell-Beginners Mailing List - Discussion of primarily
beginner-level topics related to Haskell <[email protected]>
Subject: Re: [Haskell-beginners] foldr on infinite list to decide
prime number
Message-ID: <[email protected]>
Content-Type: text/plain; charset="windows-1252"; Format="flowed"
Doesn't foldr have to "reach" to the far right of the list of infinite
primes to get the last number since it consumes from the right?
On 2/1/2016 7:01 PM, Francesco Ariis wrote:
> On Tue, Feb 02, 2016 at 10:32:10AM +0900, Chul-Woong Yang wrote:
>> Hi, all.
>>
>> While I know that foldr can be used on infinite list to generate infinite
>> list,
>> I'm having difficulty in understaind following code:
>>
>> isPrime n = n > 1 && -- from haskell wiki foldr (\p r -> p*p > n || ((n
>> `rem` p) /= 0 && r)) True primes primes = 2 : filter isPrime [3,5..]
>>
>> primes is a infinite list of prime numbers, and isPrime does foldr to get a
>> boolean value.
>> What causes foldr to terminate folding?
> foldr _immediately_ calls the passed function, hence /it can short
> circuit/, that isn't the case for foldl.
>
> I wrote an article to explain it [1]. It was drafted in a time when
> foldr and friends were monomorphic (i.e. they only worked with lists),
> but it should illustrate the point nicely.
>
> Current polymorphic implementation of foldr is:
>
> foldr :: (a -> b -> b) -> b -> t a -> b
> foldr f z t = appEndo (foldMap (Endo #. f) t) z
>
> and I must admit I have problems explaining why it terminates
> early (as it does).
>
> [1] http://ariis.it/static/articles/haskell-laziness/page.html (more
> complex cases section)
> _______________________________________________
> Beginners mailing list
> [email protected]
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
--
------------------------------------------------------------------------
Derek Riemer
* Department of computer science, third year undergraduate student.
* Proud user of the NVDA screen reader.
* Open source enthusiast.
* Member of Bridge Cu
* Avid skiier.
Websites:
Honors portfolio <http://derekriemer.com>
Awesome little hand built weather app!
<http://django.derekriemer.com/weather/>
email me at [email protected] <mailto:[email protected]>
Phone: (303) 906-2194
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://mail.haskell.org/pipermail/beginners/attachments/20160202/2d2d759f/attachment-0001.html>
------------------------------
Message: 4
Date: Wed, 3 Feb 2016 09:53:13 +0900
From: Chul-Woong Yang <[email protected]>
To: The Haskell-Beginners Mailing List - Discussion of primarily
beginner-level topics related to Haskell <[email protected]>
Subject: Re: [Haskell-beginners] foldr with short circuit and
accumulator
Message-ID:
<calmycjoqtpvhg53om4phwbhm+zsgxrqsmwrfpbzpbjzb6et...@mail.gmail.com>
Content-Type: text/plain; charset=UTF-8
Thank you for introducing mind-blowing ssfold, which has step function
with three argument:
> ssfold p f a0 xs = foldr (\x xs a -> if p a then a else xs (f a x)) id xs a0
Having spent last night, I've yet to got it. What a slow person!
Regards,
2016-02-02 18:03 GMT+09:00 KwangYul Seo <[email protected]>:
> Hi,
>
> Implementing a short-circuiting fold was already discussed in the
> haskell-cafe mailing list.
>
> https://mail.haskell.org/pipermail/haskell-cafe/2007-April/024171.html
>
>
> On Tue, Feb 2, 2016 at 4:15 PM, Chul-Woong Yang <[email protected]>
> wrote:
>>
>> Hi, all.
>>
>> Can it be possible to do fold with short circuit and accumulator both?
>> For example, can we find an element which is same value to adjacent one?
>>
>> findAdjacent [1,2..n, n, n+1, n+2.......] => n
>> \__very long__/
>>
>> Though there can be many ways to do it, Can we do it with fold[r|l]?
>>
>> I'll be happy to receive any comments.
>>
>> Chul-Woong
>> _______________________________________________
>> Beginners mailing list
>> [email protected]
>> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>
>
>
> _______________________________________________
> Beginners mailing list
> [email protected]
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>
------------------------------
Message: 5
Date: Wed, 3 Feb 2016 10:23:46 +0900
From: Chul-Woong Yang <[email protected]>
To: The Haskell-Beginners Mailing List - Discussion of primarily
beginner-level topics related to Haskell <[email protected]>
Subject: Re: [Haskell-beginners] foldr with short circuit and
accumulator
Message-ID:
<CALmycjpj9v9oFQV8ti7RcCFw7WCC=wdm2xrqdxs1ixsma0j...@mail.gmail.com>
Content-Type: text/plain; charset=UTF-8
Hi,
Thanks for your reply. I've done zip'ing in those kinds of problem, also.
I think it'd be better if we can do it without zip'ing, with folding only.
With help of KwangYul Seo, I know now that short-circuiting with fold
is possible,
and I made ssfold version of findAdjacent:
-- Spencer Janssen's ssfold, from haskell-cafe
ssfold p f a0 xs = foldr (\x xs a -> if p a then a else xs (f a x)) id xs a0
findAdjacent :: [Int] -> Maybe Int
findAdjacent = snd . ssfold (uncurry const) step (False, Nothing)
where step acc@(True, _) _ = acc
step (False, last) x = (if Just x == last then True else False, Just x)
findAdjacent $ [1..10000] ++ [10000..]
==> 10000
It might be overkill for finding adjacent entry. It's better to use zip'ing.
But I think ssfold can be useful in other cases.
Any comments will be welcomed.
Regards,
Chul-Woong
2016-02-02 17:47 GMT+09:00 Theodore Lief Gannon <[email protected]>:
> If you mean is there any f and z for which this can be done with only "foldr
> f z xs", I believe the answer is no. If you don't mind extra parts, though:
>
> findAdjacent :: (Eq a) => [a] -> Maybe a
> findAdjacent xs = foldr f Nothing $ zip xs ps
> where
> ps = zipWith (==) (tail xs) xs
> f (x,p) next = if p then Just x else next
>
>
> On Mon, Feb 1, 2016 at 11:15 PM, Chul-Woong Yang <[email protected]>
> wrote:
>>
>> Hi, all.
>>
>> Can it be possible to do fold with short circuit and accumulator both?
>> For example, can we find an element which is same value to adjacent one?
>>
>> findAdjacent [1,2..n, n, n+1, n+2.......] => n
>> \__very long__/
>>
>> Though there can be many ways to do it, Can we do it with fold[r|l]?
>>
>> I'll be happy to receive any comments.
>>
>> Chul-Woong
>> _______________________________________________
>> Beginners mailing list
>> [email protected]
>> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>
>
>
> _______________________________________________
> Beginners mailing list
> [email protected]
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>
------------------------------
Message: 6
Date: Wed, 3 Feb 2016 10:56:29 +0900
From: Chul-Woong Yang <[email protected]>
To: The Haskell-Beginners Mailing List - Discussion of primarily
beginner-level topics related to Haskell <[email protected]>
Subject: Re: [Haskell-beginners] foldr on infinite list to decide
prime number
Message-ID:
<CALmycjrJfwpAXtsHfVS8=WAk_qmQutdBiVu=kxqqsswtnmc...@mail.gmail.com>
Content-Type: text/plain; charset=UTF-8
Simple foldr'ing over infinite list:
foldr (\x acc -> x || acc) False $ repeat True
Under lazy evaluation, the foldr stops expansion when x has True value
since (||) short-circuits evaluation.
In strict evaluation, foldr should reach to the far right of the
infinite list as you said.
2016-02-03 9:52 GMT+09:00 derek riemer <[email protected]>:
> Doesn't foldr have to "reach" to the far right of the list of infinite
> primes to get the last number since it consumes from the right?
>
>
> On 2/1/2016 7:01 PM, Francesco Ariis wrote:
>
> On Tue, Feb 02, 2016 at 10:32:10AM +0900, Chul-Woong Yang wrote:
>
> Hi, all.
>
> While I know that foldr can be used on infinite list to generate infinite
> list,
> I'm having difficulty in understaind following code:
>
> isPrime n = n > 1 && -- from haskell wiki foldr (\p r -> p*p > n || ((n
> `rem` p) /= 0 && r)) True primes primes = 2 : filter isPrime [3,5..]
>
> primes is a infinite list of prime numbers, and isPrime does foldr to get a
> boolean value.
> What causes foldr to terminate folding?
>
> foldr _immediately_ calls the passed function, hence /it can short
> circuit/, that isn't the case for foldl.
>
> I wrote an article to explain it [1]. It was drafted in a time when
> foldr and friends were monomorphic (i.e. they only worked with lists),
> but it should illustrate the point nicely.
>
> Current polymorphic implementation of foldr is:
>
> foldr :: (a -> b -> b) -> b -> t a -> b
> foldr f z t = appEndo (foldMap (Endo #. f) t) z
>
> and I must admit I have problems explaining why it terminates
> early (as it does).
>
> [1] http://ariis.it/static/articles/haskell-laziness/page.html (more
> complex cases section)
> _______________________________________________
> Beginners mailing list
> [email protected]
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>
>
> --
> ________________________________
>
> Derek Riemer
>
> Department of computer science, third year undergraduate student.
> Proud user of the NVDA screen reader.
> Open source enthusiast.
> Member of Bridge Cu
> Avid skiier.
>
> Websites:
> Honors portfolio
> Awesome little hand built weather app!
>
> email me at [email protected]
> Phone: (303) 906-2194
>
>
> _______________________________________________
> Beginners mailing list
> [email protected]
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>
------------------------------
Subject: Digest Footer
_______________________________________________
Beginners mailing list
[email protected]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
------------------------------
End of Beginners Digest, Vol 92, Issue 4
****************************************