Траверс в Хаскеле - PullRequest
       29

Траверс в Хаскеле

0 голосов
/ 12 сентября 2018

Я пытаюсь понять пример из Data.Traversable документации.

 data Tree a = Empty | Leaf a | Node (Tree a) a (Tree a)

instance Traversable Tree where
    traverse f Empty        = pure Empty
    traverse f (Leaf x)     = Leaf <$> f x -- confusion

Как можно применить Leaf <$> f x.Leaf не является функцией, и все еще возможно использовать ее.

Ответы [ 3 ]

0 голосов
/ 12 сентября 2018

Лист - это функция.

Если вы используете синтаксис GADT, это сразу становится очевидным:

data Tree a where
    Empty :: Tree a
    Leaf  :: a -> Tree a
    Node  :: Tree a -> a -> Tree a -> Tree a
0 голосов
/ 12 сентября 2018

Это помогает написать Tree это в GADTSyntax:

{-# Language GADTs #-}

data Tree a where
  Empty :: Tree a
  Leaf  :: a -> Tree a
  Node  :: Tree a -> a -> Tree a -> Tree a

, который дает понять, что Leaf :: a -> Tree a - это функция. Мы можем быть явно о виде Tree,

import Data.Kind

data Tree :: Type -> Type where
  ..
0 голосов
/ 12 сентября 2018

Leaf является конструктором, то есть функцией. В этом случае он имеет тип a -> Tree a. См. haskell wiki .

...