Аппликативные функторы и записи в purescript - PullRequest
1 голос
/ 19 июня 2020

В Haskell я привык делать такие вещи.

data Foo = Foo { foo :: String, bar :: String }

mFoo :: (Monad m) => m String -> m String -> m Foo
mFoo foo bar = Foo <$> foo <*> bar

Однако то же самое не работает в purescript. Есть ли способ достичь того же результата, ie сохранить синтаксис записи, разрешив частичное применение через аппликативные функторы при построении экземпляра?

Спасибо!

1 Ответ

6 голосов
/ 19 июня 2020

В PureScript вам не нужно заранее определять такой тип записи. Polymorphi c версия:

mXY :: forall a b m. Apply m => m a -> m b -> m { x :: a, y :: b }
mXY foo bar = { x: _, y: _ } <$> foo <*> bar

-- | which can be rewritten using lift2:
mXY' = Control.Apply.lift2 { x: _, y: _ }

И эквивалент monomoprhi c:

type Foo = { x :: String, y :: String }

mFoo :: forall m. Apply m => m String -> m String -> m Foo
mFoo = Control.Apply.lift2 {x: _, y: _ }

«Живая демонстрация» с использованием замечательного try.purescript.org + пользовательская сущность:

https://try.purescript.org/?gist=a37f5f0c50e0640e34ea5a4788c0c999

Конечно, есть практическая ценность в использовании newtype около Record, например:

newtype Foo' = Foo' { x :: String, y :: String }

и в В таком случае я бы предложил что-то вроде:

mFoo'' foo bar = map Foo' $ { x: _ , y: _ } <$> foo <*> bar

, но я думаю, что это можно было бы выразить более элегантно и короче, чего я не знаю: -)

...