Null Pointer Pattern
Carter Schonwald
carter.schonwald at gmail.com
Mon Aug 17 16:14:04 UTC 2020
There’s an interesting idea or two in here. Like, should we support having
non-nullable pointers?
On Mon, Aug 17, 2020 at 11:13 AM David Feuer <david.feuer at gmail.com> wrote:
> GHC.Ptr feels like too low-level a zone for it. If the objections I
> predicted don't appear, Foreign.Ptr sure seems more logical.
>
> On Mon, Aug 17, 2020, 11:07 AM Andrew Martin <andrew.thaddeus at gmail.com>
> wrote:
>
>> There is always the possibility of using GHC.Ptr as a home for it instead
>> of Foreign.Ptr. The main reason I would want this in base rather than just
>> some library is that, as a library author, I would never pick up an extra
>> dependency for something that trivial.
>>
>> On Mon, Aug 17, 2020 at 10:52 AM David Feuer <david.feuer at gmail.com>
>> wrote:
>>
>>> In the context of GHC Haskell, that's definitely the Right Thing. I
>>> think what might concern some people is that pattern synonyms as we know
>>> them are a very GHC thing, while the Ptr business is pretty much Report
>>> Haskell.
>>>
>>> On Mon, Aug 17, 2020, 10:44 AM Andrew Martin <andrew.thaddeus at gmail.com>
>>> wrote:
>>>
>>>> Foreign.Ptr provides nullPtr. It would make some of my code more terse
>>>> if this was additionally provided as a pattern synonym. The pattern synonym
>>>> can be defined as:
>>>>
>>>> {-# language ViewPatterns #-}
>>>> {-# language PatternSynonyms #-}
>>>> module NullPointerPattern
>>>> ( pattern Null
>>>> ) where
>>>> import Foreign.Ptr (Ptr,nullPtr)
>>>> pattern Null :: Ptr a
>>>> pattern Null <- ((\x -> x == nullPtr) -> True)
>>>> where Null = nullPtr
>>>>
>>>> Any here is example of code that becomes more terse once this is
>>>> available:
>>>>
>>>> foo :: IO (Either Error (Ptr Foo))
>>>> foo = do
>>>> p <- initialize mySettings
>>>> if p == nullPtr
>>>> then pure (Left InitializeFailure)
>>>> else pure (Right p)
>>>>
>>>> With the pattern synonym, we are able to take advantage of LambdaCase:
>>>>
>>>> foo :: IO (Either Error (Ptr Foo))
>>>> foo = initialize mySettings >>= \case
>>>> Null -> pure (Left InitializeFailure)
>>>> p -> pure (Right p)
>>>>
>>>> I'm curious what others think.
>>>>
>>>> --
>>>> -Andrew Thaddeus Martin
>>>> _______________________________________________
>>>> Libraries mailing list
>>>> Libraries at haskell.org
>>>> http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
>>>>
>>>
>>
>> --
>> -Andrew Thaddeus Martin
>>
> _______________________________________________
> Libraries mailing list
> Libraries at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/libraries/attachments/20200817/c932b1d9/attachment.html>
More information about the Libraries
mailing list