Send Beginners mailing list submissions to
        [email protected]

To subscribe or unsubscribe via the World Wide Web, visit
        http://www.haskell.org/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:  Haskell network sample (yang.zhao)
   2.  Instance declaration needs more info? (Dimitri DeFigueiredo)
   3. Re:  Instance declaration needs more info? (Bob Ippolito)


----------------------------------------------------------------------

Message: 1
Date: Wed, 21 May 2014 16:17:04 +0800
From: "yang.zhao" <[email protected]>
To: The Haskell-Beginners Mailing List - Discussion of primarily
        beginner-level topics related to Haskell <[email protected]>
Subject: Re: [Haskell-beginners] Haskell network sample
Message-ID:
        <CAKXgZ3akenbAGFm+qKHVdp4hGnc0t8U+qv=zevrs1jsfrmv...@mail.gmail.com>
Content-Type: text/plain; charset="utf-8"

Thank you very much, Bob and Sylvain.
i test hGetLine instead of hGetContents.


2014-05-21 16:07 GMT+08:00 Sylvain Henry <[email protected]>:

> hGetContents puts the handle in semi-closed state and reads until there is
> nothing left to read. Hence you have a deadlock. Use hGetLine in "cli".
>
> Sylvain
>
>
> 2014-05-21 9:15 GMT+02:00 yang.zhao <[email protected]>:
>
> omg, i test it on Windows, it's ok now. GHC is 7.6.3.
>> i really don't konw why this happen..
>>
>> but there is another question on Windows
>>
>>
>> main = withSocketsDo $ do
>>     s <- listenOn $ PortNumber $ fromIntegral port
>>     putStrLn "Listening..."
>>     (h, _, _) <- accept s
>>     putStrLn "After accept"
>>     sline <- hGetLine h
>>     putStrLn $ "get line from handle"++sline
>>     hPutStrLn h "xxxx...."
>>     putStrLn "send first done"
>>
>>     --second recv
>>     slinea <- hGetLine h
>>     putStrLn $ "get line from handle"++slinea
>>
>>     hPutStrLn h "yyyy....."
>>     putStrLn "send second done"
>>
>>     threadDelay 1000000
>> --
>> cli:
>>
>> main = withSocketsDo $ do
>>     h <- connectTo "127.0.0.1" $ PortNumber $ fromIntegral port
>>     putStrLn "After connect"
>>     hPutStrLn h "xxx"
>>     putStrLn "put first to handle done"
>>
>>     bs <- hGetContents h
>>     putStrLn "read from handle done "
>>     putStrLn bs
>>
>>     --second send
>>     hPutStrLn h "yyy"
>>     putStrLn "put second to handle done"
>>     bfs <- hGetContents h
>>
>>     putStrLn "read from handle done "
>>     putStrLn bs
>>
>>
>> the second send and recv is blocking...
>> server's output:
>> Listening...
>> After accept
>> get line from handlexxx
>> send first done
>>
>> client's output:
>> After connect
>> put first to handle done
>> read from handle done
>> xxx....
>>
>>
>> ..... T_T
>>
>>
>>
>>
>> 2014-05-21 14:10 GMT+08:00 yang.zhao <[email protected]>:
>>
>> Here's my new code:
>>>
>>> $ cat serv.hs
>>>
>>> import Control.Concurrent
>>> import System.IO
>>> import Network
>>>
>>> port :: Int
>>> port = 1234
>>>
>>> main :: IO ()
>>> main = withSocketsDo $ do
>>>     s <- listenOn $ PortNumber $ fromIntegral port
>>>     putStrLn "Listening..."
>>>
>>>     (h, _, _) <- accept s
>>>     putStrLn "After accept"
>>>     sline <- hGetLine h
>>>     putStrLn "get line from handle"
>>>
>>>     hPutStrLn h sline
>>>     putStrLn $ "send "++sline
>>>     threadDelay 1000000
>>>
>>>     hClose h
>>>     sClose s
>>>
>>> --------
>>> $ cat clie.hs
>>>
>>> import System.IO
>>> import Network
>>>
>>> port :: Int
>>> port = 1234
>>>
>>> main :: IO ()
>>> main = withSocketsDo $ do
>>>     h <- connectTo "127.0.0.1" $ PortNumber $ fromIntegral port
>>>     putStrLn "After connect"
>>>     hPutStrLn h "hello"
>>>     putStrLn "put hello to handle done"
>>>     bs <- hGetContents h
>>>     putStrLn "read from handle done"
>>>     putStrLn bs
>>>     hClose h
>>>
>>>
>>> ===
>>> one terminal, run ./serv, then run ./clie in another terminal. Output is
>>> :
>>>
>>> $ ./serv
>>> Listening...
>>> After accept
>>>
>>> $ ./clie
>>> After connect
>>> put hello to handle done
>>> read from handle done
>>>
>>>
>>> it seems that client has read from then handle, but donesn't read
>>> anything, then block.
>>> and server donesn't receive anything, still wait for something...
>>>
>>> ghc version is 7.4.1, because of this?..
>>>
>>>
>>> 2014-05-21 13:57 GMT+08:00 Bob Ippolito <[email protected]>:
>>>
>>> Not sure why you're having issues, I just tried it on GHC 7.6.3 on
>>>> Fedora 20 and it worked fine there as well (both with runhaskell or
>>>> compiled with -O).
>>>>
>>>> I might start adding putStrLn statements to the code to see where it's
>>>> unexpectedly blocking, or perhaps use 127.0.0.1 instead of "localhost" in
>>>> case the issue is a DNS misconfiguration.
>>>>
>>>>
>>>>
>>>> On Tue, May 20, 2014 at 10:51 PM, yang.zhao <[email protected]> wrote:
>>>>
>>>>> thanks for your replay.
>>>>> i run the two program in two different teriminal for sure.
>>>>>
>>>>> it works for you?
>>>>> but why can't run well on my computer.
>>>>>
>>>>> make me creazy....
>>>>>
>>>>>
>>>>> 2014-05-21 13:47 GMT+08:00 Bob Ippolito <[email protected]>:
>>>>>
>>>>> How precisely are you trying to run the client? Are you typing it in
>>>>>> to the same terminal? If so, then the client is never actually started,
>>>>>> because when you type ./cli the input is going to ./serv and not the 
>>>>>> shell.
>>>>>> Try running the client in a separate terminal.
>>>>>>
>>>>>> It works for me here on Mac OS X 10.9.2 with GHC 7.8.2.
>>>>>>
>>>>>>
>>>>>> On Tue, May 20, 2014 at 10:42 PM, yang.zhao <[email protected]>wrote:
>>>>>>
>>>>>>> hi guys,
>>>>>>> I'm newbie, just begin to learn Haskell.
>>>>>>> now i write a very simple server and client .
>>>>>>>
>>>>>>> Server:
>>>>>>> import Control.Concurrent
>>>>>>> import System.IO
>>>>>>> import Network
>>>>>>>
>>>>>>> port :: Int
>>>>>>> port = 1234
>>>>>>>
>>>>>>> main :: IO ()
>>>>>>> main = withSocketsDo $ do
>>>>>>>     s <- listenOn $ PortNumber $ fromIntegral port
>>>>>>>     (h, _, _) <- accept s
>>>>>>>
>>>>>>>     sline <- hGetLine h
>>>>>>>     hPutStrLn h sline
>>>>>>>     putStrLn $ "send "++sline
>>>>>>>     threadDelay 1000000
>>>>>>>
>>>>>>>     hClose h
>>>>>>>     sClose s
>>>>>>>
>>>>>>> Client :
>>>>>>> import System.IO
>>>>>>> import Network
>>>>>>>
>>>>>>> port :: Int
>>>>>>> port = 1234
>>>>>>>
>>>>>>> main :: IO ()
>>>>>>> main = withSocketsDo $ do
>>>>>>>     h <- connectTo "localhost" $ PortNumber $ fromIntegral port
>>>>>>>     hPutStrLn h "hello"
>>>>>>>     bs <- hGetContents h
>>>>>>>     putStrLn bs
>>>>>>>     hClose h
>>>>>>>
>>>>>>>
>>>>>>> And, it doesn't work now . I run ./serv , then run ./cli , they will
>>>>>>> block all the time.
>>>>>>> but,  when i run ./serv, and telnet localhost 1234 in another
>>>>>>> terminal, it works fine.
>>>>>>> so i don't know what's the wrong with my code.
>>>>>>> anybody can tell me about my problem?
>>>>>>>
>>>>>>> os is Debian 7,  haskell-platform  2012.2.0.0
>>>>>>>
>>>>>>> thanks a lot!!!
>>>>>>> --
>>>>>>> K.I.S.S.
>>>>>>>
>>>>>>> _______________________________________________
>>>>>>> Beginners mailing list
>>>>>>> [email protected]
>>>>>>> http://www.haskell.org/mailman/listinfo/beginners
>>>>>>>
>>>>>>>
>>>>>>
>>>>>> _______________________________________________
>>>>>> Beginners mailing list
>>>>>> [email protected]
>>>>>> http://www.haskell.org/mailman/listinfo/beginners
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>> --
>>>>> K.I.S.S.
>>>>>
>>>>> _______________________________________________
>>>>> Beginners mailing list
>>>>> [email protected]
>>>>> http://www.haskell.org/mailman/listinfo/beginners
>>>>>
>>>>>
>>>>
>>>> _______________________________________________
>>>> Beginners mailing list
>>>> [email protected]
>>>> http://www.haskell.org/mailman/listinfo/beginners
>>>>
>>>>
>>>
>>>
>>> --
>>> K.I.S.S.
>>>
>>
>>
>>
>> --
>> K.I.S.S.
>>
>> _______________________________________________
>> Beginners mailing list
>> [email protected]
>> http://www.haskell.org/mailman/listinfo/beginners
>>
>>
>
> _______________________________________________
> Beginners mailing list
> [email protected]
> http://www.haskell.org/mailman/listinfo/beginners
>
>


-- 
K.I.S.S.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: 
<http://www.haskell.org/pipermail/beginners/attachments/20140521/7fbdf46d/attachment-0001.html>

------------------------------

Message: 2
Date: Wed, 21 May 2014 03:18:59 -0600
From: Dimitri DeFigueiredo <[email protected]>
To: The Haskell-Beginners Mailing List - Discussion of primarily
        beginner-level topics related to Haskell <[email protected]>
Subject: [Haskell-beginners] Instance declaration needs more info?
Message-ID: <[email protected]>
Content-Type: text/plain; charset=ISO-8859-1; format=flowed

Hi All,

I'm trying to write a simplified dimensional library where where 
quantities in meters, seconds and meters/second can all co-exist 
adjusting their respective units when multiplied and/or divided.

Also, meter+meter is allowed, but meter+second should cause the type 
checker to complain.

This is a bit like a *much* simplified version of the Units library. 
However, I am having trouble understanding why my instance declaration 
below appears to be under specified. Here's the code:

------------
module Dimensional where
import qualified Prelude

-- A Group allows you to add and subtract (but not multiply or divide)
class Group a where

     (+) :: a -> a -> a

     (-) :: a -> a -> a
     x - y = x + negate y

     negate              :: a -> a
     negate x             = fromInteger 0 - x

     fromInteger         :: Prelude.Integer -> a

class Unit a where

     (*) :: (Unit a, Unit b, Unit c) => a -> b -> c
     (/) :: (Unit a, Unit b, Unit c) => a -> b -> c
     toDouble :: a -> Prelude.Double

instance Unit Prelude.Double where

     (*) x y    = (Prelude.*) x (toDouble y)   -- <----- Error here
     (/) x y    = (Prelude./) x (toDouble y)
     toDouble x = x

------------
GHC complains as follows:

     Could not deduce (c ~ Prelude.Double)
     from the context (Unit Prelude.Double, Unit b, Unit c)
       bound by the type signature for
                  * :: (Unit Prelude.Double, Unit b, Unit c) =>
                       Prelude.Double -> b -> c
       at /code/haskell/dimensional.hs:25:5-43
       `c' is a rigid type variable bound by
           the type signature for
             * :: (Unit Prelude.Double, Unit b, Unit c) =>
                  Prelude.Double -> b -> c
           at /code/haskell/dimensional.hs:25:5
     In the first argument of `(Prelude.*)', namely `x'
     In the expression: (Prelude.*) x (toDouble y)
     In an equation for `*': * x y = (Prelude.*) x (toDouble y)

Any pointers would be much appreciated!

Thanks,

Dimitri




------------------------------

Message: 3
Date: Wed, 21 May 2014 02:28:41 -0700
From: Bob Ippolito <[email protected]>
To: The Haskell-Beginners Mailing List - Discussion of primarily
        beginner-level topics related to Haskell <[email protected]>
Subject: Re: [Haskell-beginners] Instance declaration needs more info?
Message-ID:
        <cacwmpm9mz5pcmcmjdc7umcnw8ql4elkvbact4p5yn+dnwww...@mail.gmail.com>
Content-Type: text/plain; charset="utf-8"

The trouble is that your specification says that Unit c is the return type
(the caller can choose any Unit instance), but this implementation can only
evaluate to a Prelude.Double. One way to solve this is to add a fromDouble
:: Double -> Unit a and wrap the expression with that in order to satisfy
Unit c.

On Wednesday, May 21, 2014, Dimitri DeFigueiredo <[email protected]>
wrote:

> Hi All,
>
> I'm trying to write a simplified dimensional library where where
> quantities in meters, seconds and meters/second can all co-exist adjusting
> their respective units when multiplied and/or divided.
>
> Also, meter+meter is allowed, but meter+second should cause the type
> checker to complain.
>
> This is a bit like a *much* simplified version of the Units library.
> However, I am having trouble understanding why my instance declaration
> below appears to be under specified. Here's the code:
>
> ------------
> module Dimensional where
> import qualified Prelude
>
> -- A Group allows you to add and subtract (but not multiply or divide)
> class Group a where
>
>     (+) :: a -> a -> a
>
>     (-) :: a -> a -> a
>     x - y = x + negate y
>
>     negate              :: a -> a
>     negate x             = fromInteger 0 - x
>
>     fromInteger         :: Prelude.Integer -> a
>
> class Unit a where
>
>     (*) :: (Unit a, Unit b, Unit c) => a -> b -> c
>     (/) :: (Unit a, Unit b, Unit c) => a -> b -> c
>     toDouble :: a -> Prelude.Double
>
> instance Unit Prelude.Double where
>
>     (*) x y    = (Prelude.*) x (toDouble y)   -- <----- Error here
>     (/) x y    = (Prelude./) x (toDouble y)
>     toDouble x = x
>
> ------------
> GHC complains as follows:
>
>     Could not deduce (c ~ Prelude.Double)
>     from the context (Unit Prelude.Double, Unit b, Unit c)
>       bound by the type signature for
>                  * :: (Unit Prelude.Double, Unit b, Unit c) =>
>                       Prelude.Double -> b -> c
>       at /code/haskell/dimensional.hs:25:5-43
>       `c' is a rigid type variable bound by
>           the type signature for
>             * :: (Unit Prelude.Double, Unit b, Unit c) =>
>                  Prelude.Double -> b -> c
>           at /code/haskell/dimensional.hs:25:5
>     In the first argument of `(Prelude.*)', namely `x'
>     In the expression: (Prelude.*) x (toDouble y)
>     In an equation for `*': * x y = (Prelude.*) x (toDouble y)
>
> Any pointers would be much appreciated!
>
> Thanks,
>
> Dimitri
>
>
> _______________________________________________
> Beginners mailing list
> [email protected]
> http://www.haskell.org/mailman/listinfo/beginners
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: 
<http://www.haskell.org/pipermail/beginners/attachments/20140521/727ee3f8/attachment.html>

------------------------------

Subject: Digest Footer

_______________________________________________
Beginners mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/beginners


------------------------------

End of Beginners Digest, Vol 71, Issue 25
*****************************************

Reply via email to