[Haskell-beginners] Beginners Digest, Vol 89, Issue 38 How to define a simple function

Gesh gesh at gesh.uni.cx
Tue Nov 24 08:08:00 UTC 2015


On November 24, 2015 6:29:16 AM GMT+02:00, MJ Williams <matthewjwilliams101 at gmail.com> wrote:
>In short, your types do not match in your calculation of the half of
>the length of the list.  According to GHCI
>
>length :: [a] -> Int
>(/) :: Fractional a => a -> a -> a
>floor :: (Integral b, RealFrac a) => a -> b
>
>Can you see how you might run into problems with this mixed bag of
>types?
>
>The only instance where you might find type compatibility between
>above types would be if you were passing a value of type `Int' to a
>function that accepted values of type `Integral'.  `Int', if you like,
>is a subset of `Integral'
>
>A simple solution would be to replace `/' with `div' (`div :: Integral
>a => a -> a -> a').  Thus, your functionwould look something like
>
>halve :: [a] -> [[a], [a]]
>halve xs = [take longitud xs, drop longitud xs]
>  where
>  longitud = div (length xs) 2
>
>Hope that helps, and don't hesitate to come back with more questions.
>
>Matthew
>
>
>On 23/11/2015, Francisco Gutierrez <fgutiers2002 at yahoo.com> wrote:
>> Dear sirs:I am defining a function halve, that breaks a list in two
>halfs.
>> But I always get an error. Below is my code. What am I doing
>> wrong?Thanks!halve xs = [take (floor (longitud/2)), drop (floor
>> (longitud/2))]  where longitud = length xs
>>
>>
>>       From: "beginners-request at haskell.org"
><beginners-request at haskell.org>
>>  To: beginners at haskell.org
>>  Sent: Saturday, November 21, 2015 8:21 PM
>>  Subject: Beginners Digest, Vol 89, Issue 38
>>
>> Send Beginners mailing list submissions to
>>     beginners at haskell.org
>>
>> 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
>>     beginners-request at haskell.org
>>
>> You can reach the person managing the list at
>>     beginners-owner at haskell.org
>>
>> When replying, please edit your Subject line so it is more specific
>> than "Re: Contents of Beginners digest..."
>>
>>
>> Today's Topics:
>>
>>   1. Re:  Warning: Tab Character (Dan Stromberg)
>>   2. Re:  Warning: Tab Character (Jeon-Young Kang)
>>   3. Re:  Warning: Tab Character (Thomas Jakway)
>>
>>
>>
>----------------------------------------------------------------------
>>
>> Message: 1
>> Date: Sat, 21 Nov 2015 16:44:21 -0800
>> From: Dan Stromberg <strombrg at gmail.com>
>> To: The Haskell-Beginners Mailing List - Discussion of primarily
>>     beginner-level topics related to Haskell <beginners at haskell.org>
>> Subject: Re: [Haskell-beginners] Warning: Tab Character
>> Message-ID:
>>    
><CAOvKW55oxCcEhtqppC0bXQZjOEEv5vcYnBTWHaj9C5vhhm7g+w at mail.gmail.com>
>> Content-Type: text/plain; charset="utf-8"
>>
>> I believe the first version of make required tabs, but some
>subsequent
>> versions have relaxed that requirement to make things easier.
>>
>> Here's an example on a Linux Mint system (the 20's are of course
>spaces) :
>> $ od -cx < Makefile
>> cmd output started 2015 Sat Nov 21 04:39:47 PM PST
>> 0000000  \n  g  o  :  \n                  .  /  t  \n  \n
>>           670a    3a6f    200a    2020    2e20    742f    0a0a
>> 0000016
>> above cmd output done    2015 Sat Nov 21 04:39:47 PM PST
>> dstromberg at dell-inspiron:/var/tmp/make-tabs i686-pc-linux-gnu 25234
>>
>> $ make
>> cmd output started 2015 Sat Nov 21 04:39:48 PM PST
>> Makefile:3: *** missing separator.  Stop.
>> above cmd output done    2015 Sat Nov 21 04:39:48 PM PST
>> dstromberg at dell-inspiron:/var/tmp/make-tabs i686-pc-linux-gnu 25234
>>
>> $ make --version
>> cmd output started 2015 Sat Nov 21 04:39:53 PM PST
>> GNU Make 3.81
>> Copyright (C) 2006  Free Software Foundation, Inc.
>> This is free software; see the source for copying conditions.
>> There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
>> PARTICULAR PURPOSE.
>>
>> This program built for i686-pc-linux-gnu
>> above cmd output done    2015 Sat Nov 21 04:39:53 PM PST
>> dstromberg at dell-inspiron:/var/tmp/make-tabs i686-pc-linux-gnu 25234
>>
>>
>> I'll add that vim's Makefile syntax highlighting puts the
>space-indented
>> line in red, suggesting an error.  Changing the spaces to a single
>tab
>> makes the red go away.
>>
>> HTH
>>
>> On Sat, Nov 21, 2015 at 3:34 PM, Thomas Jakway <tjakway at nyu.edu>
>wrote:
>>
>>> Why would make require tabs...?
>>> Admittedly it's been a long time since I've written any makefiles by
>hand
>>> but I always use spaces instead of tabs and have never had any
>problems.
>>>
>>> On Nov 21, 2015 6:01 PM, David Moberg <kaddkaka at gmail.com> wrote:
>>> >
>>> > Have you found "soft tabs"? That option will make TextMate use
>spaces
>>> instead of tab characters. Read 4.11 "Using Spaces Instead of Tabs"
>in
>>> Dan
>>> Strombergs link for instrucitons.
>>> >
>>> > 2015-11-21 21:36 GMT+01:00 Jeon-Young Kang <jykang22 at gmail.com>:
>>> >>
>>> >> I've tried to choose "instead of spaces". But there is no option
>of
>>> mine (Textmate 2 beta).
>>> >>
>>> >> On Sat, Nov 21, 2015 at 3:14 PM, Dan Stromberg
><strombrg at gmail.com>
>>> wrote:
>>> >>>
>>> >>>
>>> >>> Perhaps enable soft tabs?
>>> >>> https://manual.macromates.com/en/working_with_text
>>> >>>
>>> >>> This is an issue in Python too (at least from PEP8's
>perspective) -
>>> but note that many "make" programs require tabs instead of spaces.
>>> >>>
>>> >>> On Sat, Nov 21, 2015 at 11:13 AM, Jeon-Young Kang
>>> >>> <jykang22 at gmail.com>
>>> wrote:
>>> >>>>
>>> >>>> Hello everyone.
>>> >>>>
>>> >>>>
>>> >>>> I am a newbie of Haskell, using Textmate on mac.
>>> >>>>
>>> >>>>
>>> >>>> I got the following warning. How can I fix it?
>>> >>>>
>>> >>>>
>>> >>>> Warning:
>>> >>>>
>>> >>>>    Tab character
>>> >>>>
>>> >>>> Ok, modules loaded: Main.
>>> >>>>
>>> >>>>
>>> >>>>
>>> >>>> Sincerely,
>>> >>>> Young
>>> >>>>
>>> >>>> _______________________________________________
>>> >>>> Beginners mailing list
>>> >>>> Beginners at haskell.org
>>> >>>> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>>> >>>>
>>> >>>
>>> >>>
>>> >>>
>>> >>> --
>>> >>> Dan Stromberg
>>> >>>
>>> >>> _______________________________________________
>>> >>> Beginners mailing list
>>> >>> Beginners at haskell.org
>>> >>> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>>> >>>
>>> >>
>>> >>
>>> >>
>>> >> --
>>> >> Department of Geography
>>> >> State University of New York at Buffalo
>>> >>
>>> >> jykang22 at gmail.com
>>> >>
>>> >> Jeon-Young Kang
>>> >>
>>> >> _______________________________________________
>>> >> Beginners mailing list
>>> >> Beginners at haskell.org
>>> >> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>>> >>
>>> >
>>> _______________________________________________
>>> Beginners mailing list
>>> Beginners at haskell.org
>>> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>>>
>>
>>
>>
>> --
>> Dan Stromberg
>> -------------- next part --------------
>> An HTML attachment was scrubbed...
>> URL:
>>
><http://mail.haskell.org/pipermail/beginners/attachments/20151121/bef7b6d7/attachment-0001.html>
>>
>> ------------------------------
>>
>> Message: 2
>> Date: Sat, 21 Nov 2015 20:03:08 -0500
>> From: Jeon-Young Kang <jykang22 at gmail.com>
>> To: The Haskell-Beginners Mailing List - Discussion of primarily
>>     beginner-level topics related to Haskell <beginners at haskell.org>
>> Subject: Re: [Haskell-beginners] Warning: Tab Character
>> Message-ID:
>>    
><CALWtiK8DqDr292Bb=J7rEa8unXBrRTt6++HSSm82DuZjY6miTQ at mail.gmail.com>
>> Content-Type: text/plain; charset="utf-8"
>>
>> Thanks! I figured out.
>>
>> On Sat, Nov 21, 2015 at 7:44 PM, Dan Stromberg <strombrg at gmail.com>
>wrote:
>>
>>>
>>> I believe the first version of make required tabs, but some
>subsequent
>>> versions have relaxed that requirement to make things easier.
>>>
>>> Here's an example on a Linux Mint system (the 20's are of course
>spaces)
>>> :
>>> $ od -cx < Makefile
>>> cmd output started 2015 Sat Nov 21 04:39:47 PM PST
>>> 0000000  \n  g  o  :  \n                  .  /  t  \n  \n
>>>            670a    3a6f    200a    2020    2e20    742f    0a0a
>>> 0000016
>>> above cmd output done    2015 Sat Nov 21 04:39:47 PM PST
>>> dstromberg at dell-inspiron:/var/tmp/make-tabs i686-pc-linux-gnu 25234
>>>
>>> $ make
>>> cmd output started 2015 Sat Nov 21 04:39:48 PM PST
>>> Makefile:3: *** missing separator.  Stop.
>>> above cmd output done    2015 Sat Nov 21 04:39:48 PM PST
>>> dstromberg at dell-inspiron:/var/tmp/make-tabs i686-pc-linux-gnu 25234
>>>
>>> $ make --version
>>> cmd output started 2015 Sat Nov 21 04:39:53 PM PST
>>> GNU Make 3.81
>>> Copyright (C) 2006  Free Software Foundation, Inc.
>>> This is free software; see the source for copying conditions.
>>> There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
>>> PARTICULAR PURPOSE.
>>>
>>> This program built for i686-pc-linux-gnu
>>> above cmd output done    2015 Sat Nov 21 04:39:53 PM PST
>>> dstromberg at dell-inspiron:/var/tmp/make-tabs i686-pc-linux-gnu 25234
>>>
>>>
>>> I'll add that vim's Makefile syntax highlighting puts the
>space-indented
>>> line in red, suggesting an error.  Changing the spaces to a single
>tab
>>> makes the red go away.
>>>
>>> HTH
>>>
>>> On Sat, Nov 21, 2015 at 3:34 PM, Thomas Jakway <tjakway at nyu.edu>
>wrote:
>>>
>>>> Why would make require tabs...?
>>>> Admittedly it's been a long time since I've written any makefiles
>by
>>>> hand
>>>> but I always use spaces instead of tabs and have never had any
>problems.
>>>>
>>>> On Nov 21, 2015 6:01 PM, David Moberg <kaddkaka at gmail.com> wrote:
>>>> >
>>>> > Have you found "soft tabs"? That option will make TextMate use
>spaces
>>>> instead of tab characters. Read 4.11 "Using Spaces Instead of Tabs"
>in
>>>> Dan
>>>> Strombergs link for instrucitons.
>>>> >
>>>> > 2015-11-21 21:36 GMT+01:00 Jeon-Young Kang <jykang22 at gmail.com>:
>>>> >>
>>>> >> I've tried to choose "instead of spaces". But there is no option
>of
>>>> mine (Textmate 2 beta).
>>>> >>
>>>> >> On Sat, Nov 21, 2015 at 3:14 PM, Dan Stromberg
><strombrg at gmail.com>
>>>> wrote:
>>>> >>>
>>>> >>>
>>>> >>> Perhaps enable soft tabs?
>>>> >>> https://manual.macromates.com/en/working_with_text
>>>> >>>
>>>> >>> This is an issue in Python too (at least from PEP8's
>perspective) -
>>>> but note that many "make" programs require tabs instead of spaces.
>>>> >>>
>>>> >>> On Sat, Nov 21, 2015 at 11:13 AM, Jeon-Young Kang
>>>> >>> <jykang22 at gmail.com>
>>>> wrote:
>>>> >>>>
>>>> >>>> Hello everyone.
>>>> >>>>
>>>> >>>>
>>>> >>>> I am a newbie of Haskell, using Textmate on mac.
>>>> >>>>
>>>> >>>>
>>>> >>>> I got the following warning. How can I fix it?
>>>> >>>>
>>>> >>>>
>>>> >>>> Warning:
>>>> >>>>
>>>> >>>>    Tab character
>>>> >>>>
>>>> >>>> Ok, modules loaded: Main.
>>>> >>>>
>>>> >>>>
>>>> >>>>
>>>> >>>> Sincerely,
>>>> >>>> Young
>>>> >>>>
>>>> >>>> _______________________________________________
>>>> >>>> Beginners mailing list
>>>> >>>> Beginners at haskell.org
>>>> >>>> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>>>> >>>>
>>>> >>>
>>>> >>>
>>>> >>>
>>>> >>> --
>>>> >>> Dan Stromberg
>>>> >>>
>>>> >>> _______________________________________________
>>>> >>> Beginners mailing list
>>>> >>> Beginners at haskell.org
>>>> >>> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>>>> >>>
>>>> >>
>>>> >>
>>>> >>
>>>> >> --
>>>> >> Department of Geography
>>>> >> State University of New York at Buffalo
>>>> >>
>>>> >> jykang22 at gmail.com
>>>> >>
>>>> >> Jeon-Young Kang
>>>> >>
>>>> >> _______________________________________________
>>>> >> Beginners mailing list
>>>> >> Beginners at haskell.org
>>>> >> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>>>> >>
>>>> >
>>>> _______________________________________________
>>>> Beginners mailing list
>>>> Beginners at haskell.org
>>>> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>>>>
>>>
>>>
>>>
>>> --
>>> Dan Stromberg
>>>
>>> _______________________________________________
>>> Beginners mailing list
>>> Beginners at haskell.org
>>> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>>>
>>>
>>
>>
>> --
>> Department of Geography
>> State University of New York at Buffalo
>>
>> jykang22 at gmail.com
>>
>> Jeon-Young Kang
>> -------------- next part --------------
>> An HTML attachment was scrubbed...
>> URL:
>>
><http://mail.haskell.org/pipermail/beginners/attachments/20151121/efe59567/attachment-0001.html>
>>
>> ------------------------------
>>
>> Message: 3
>> Date: Sat, 21 Nov 2015 20:22:04 -0500
>> From: Thomas Jakway <tjakway at nyu.edu>
>> To: The Haskell-Beginners Mailing List - Discussion of primarily
>>     beginner-level topics related to Haskell <beginners at haskell.org>
>> Subject: Re: [Haskell-beginners] Warning: Tab Character
>> Message-ID: <66118521-5ef8-4d50-b8dc-d65a38dd9620 at email.android.com>
>> Content-Type: text/plain; charset=utf-8
>>
>> Huh, cool.  I had no idea.  Thanks!
>>
>> On Nov 21, 2015 7:44 PM, Dan Stromberg <strombrg at gmail.com> wrote:
>>>
>>>
>>> I believe the first version of make required tabs, but some
>subsequent
>>> versions have relaxed that requirement to make things easier.
>>>
>>> Here's an example on a Linux Mint system (the 20's are of course
>spaces)
>>> :
>>> $ od -cx < Makefile
>>> cmd output started 2015 Sat Nov 21 04:39:47 PM PST
>>> 0000000? \n?? g?? o?? :? \n?????????????????? .?? /?? t? \n? \n
>>> ?????????? 670a??? 3a6f??? 200a??? 2020??? 2e20??? 742f??? 0a0a
>>> 0000016
>>> above cmd output done??? 2015 Sat Nov 21 04:39:47 PM PST
>>> dstromberg at dell-inspiron:/var/tmp/make-tabs i686-pc-linux-gnu 25234
>>>
>>> $ make
>>> cmd output started 2015 Sat Nov 21 04:39:48 PM PST
>>> Makefile:3: *** missing separator.? Stop.
>>> above cmd output done??? 2015 Sat Nov 21 04:39:48 PM PST
>>> dstromberg at dell-inspiron:/var/tmp/make-tabs i686-pc-linux-gnu 25234
>>>
>>> $ make --version
>>> cmd output started 2015 Sat Nov 21 04:39:53 PM PST
>>> GNU Make 3.81
>>> Copyright (C) 2006? Free Software Foundation, Inc.
>>> This is free software; see the source for copying conditions.
>>> There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
>>> PARTICULAR PURPOSE.
>>>
>>> This program built for i686-pc-linux-gnu
>>> above cmd output done??? 2015 Sat Nov 21 04:39:53 PM PST
>>> dstromberg at dell-inspiron:/var/tmp/make-tabs i686-pc-linux-gnu 25234
>>>
>>>
>>> I'll add that vim's Makefile syntax highlighting puts the
>space-indented
>>> line in red, suggesting an error.? Changing the spaces to a single
>tab
>>> makes the red go away.
>>>
>>> HTH
>>>
>>> On Sat, Nov 21, 2015 at 3:34 PM, Thomas Jakway <tjakway at nyu.edu>
>wrote:
>>>>
>>>> Why would make require tabs...?
>>>> Admittedly it's been a long time since I've written any makefiles
>by hand
>>>> but I always use spaces instead of tabs and have never had any
>problems.
>>>>
>>>> On Nov 21, 2015 6:01 PM, David Moberg <kaddkaka at gmail.com> wrote:
>>>> >
>>>> > Have you found "soft tabs"? That option will make?TextMate use
>spaces
>>>> > instead of tab characters. Read?4.11 "Using Spaces Instead of
>Tabs" in
>>>> > Dan Strombergs link for instrucitons.
>>>> >
>>>> > 2015-11-21 21:36 GMT+01:00 Jeon-Young Kang <jykang22 at gmail.com>:
>>>> >>
>>>> >> I've tried to choose "instead of spaces". But there is no option
>of
>>>> >> mine (Textmate 2 beta).
>>>> >>
>>>> >> On Sat, Nov 21, 2015 at 3:14 PM, Dan Stromberg
><strombrg at gmail.com>
>>>> >> wrote:
>>>> >>>
>>>> >>>
>>>> >>> Perhaps enable soft tabs?
>>>> >>> https://manual.macromates.com/en/working_with_text
>>>> >>>
>>>> >>> This is an issue in Python too (at least from PEP8's
>perspective) -
>>>> >>> but note that many "make" programs require tabs instead of
>spaces.
>>>> >>>
>>>> >>> On Sat, Nov 21, 2015 at 11:13 AM, Jeon-Young Kang
>>>> >>> <jykang22 at gmail.com> wrote:
>>>> >>>>
>>>> >>>> Hello everyone.
>>>> >>>>
>>>> >>>>
>>>> >>>> I am a newbie of Haskell, using Textmate on mac.
>>>> >>>>
>>>> >>>>
>>>> >>>> I got the following warning. How can I fix it?
>>>> >>>>
>>>> >>>>
>>>> >>>> Warning:
>>>> >>>>
>>>> >>>> ? ? Tab character
>>>> >>>>
>>>> >>>> Ok, modules loaded: Main.
>>>> >>>>
>>>> >>>>
>>>> >>>>
>>>> >>>> Sincerely,
>>>> >>>> Young
>>>> >>>>
>>>> >>>> _______________________________________________
>>>> >>>> Beginners mailing list
>>>> >>>> Beginners at haskell.org
>>>> >>>> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>>>> >>>>
>>>> >>>
>>>> >>>
>>>> >>>
>>>> >>> --
>>>> >>> Dan Stromberg
>>>> >>>
>>>> >>> _______________________________________________
>>>> >>> Beginners mailing list
>>>> >>> Beginners at haskell.org
>>>> >>> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>>>> >>>
>>>> >>
>>>> >>
>>>> >>
>>>> >> --
>>>> >> Department of Geography
>>>> >> State University of New York at Buffalo
>>>> >>
>>>> >> jykang22 at gmail.com
>>>> >> ?
>>>> >> Jeon-Young Kang
>>>> >>
>>>> >> _______________________________________________
>>>> >> Beginners mailing list
>>>> >> Beginners at haskell.org
>>>> >> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>>>> >>
>>>> >
>>>> _______________________________________________
>>>> Beginners mailing list
>>>> Beginners at haskell.org
>>>> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>>>
>>>
>>>
>>>
>>> --
>>> Dan Stromberg
>>
>> ------------------------------
>>
>> Subject: Digest Footer
>>
>> _______________________________________________
>> Beginners mailing list
>> Beginners at haskell.org
>> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>>
>>
>> ------------------------------
>>
>> End of Beginners Digest, Vol 89, Issue 38
>> *****************************************
>>
>>
>>
>_______________________________________________
>Beginners mailing list
>Beginners at haskell.org
>http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners

Of course, besides the numerical hierarchy problems,
you also have a type incompatibility because you didn't apply take and drop to enough arguments.
i.e. take (length xs `div` 2) :: [a] -> [a], whereas you seem to want take (length xs `div` 2) xs :: [a].

Also, note that you could rewrite your code to make
use of the commonality of your arguments, so it becomes:
> halve xs = map ($xs) . map ($ (length xs `div` 2)) $ [take, drop]
(Untested, but it should work. Only possible problem I can see is that the (length xs `div` 2) section might be illegal)
Sing map f . map g = map (f.g), we can rewrite this to:
> halve xs = map (\f -> f (length xs `div` 2) xs) [take, drop]

HTH,
Gesh


More information about the Beginners mailing list