Понимание функций доступа на Haskell - PullRequest
4 голосов
/ 13 июля 2010

Я читаю учебники Monad, и сейчас я работаю над http://www.muitovar.com/monad/moncow.xhtml, но я столкнулся с проблемой с состоянием Monad или, если быть более точным, с помощью функции доступа runState.

Тип определяется как

newtype State s a = State { runState :: (s -> (a,s)) } 

и называется, например,

runState (chncasewst3 'e' 'd' 'f') False

Я не знаю, как прочитать определение для перехода ко второй строке,особенно из-за части "State sa".Если это «State as», я мог бы сделать вывод, что метод доступа был каррирован «так далеко», как «s».

Так что вопрос таков;как прочитать определение типа, чтобы я мог видеть, как вызывать функцию доступа в этой ситуации, и, если возможно, как читать функции доступа как таковые.

1 Ответ

13 голосов
/ 14 июля 2010

Если у вас есть тип данных, определенный как

data T a b = MkT { getA :: a, getB :: b }

читать как

data T a b = MkT a b

с двумя автоматически определенными вспомогательными функциями:

getA :: (T a b) -> a
getA (MkT x _) = x

getB :: (T a b) -> b
getB (MkT _ y) = y

Когда вы применяете getA к значению T, результат будет иметь тип a.

Теперь ваш тип State состоит только из одного элемента, тип которого является функцией (:: s -> (a, s)). runState преобразует значение типа State s a в функцию этого типа.

ghci> :t runState
runState :: State s a -> s -> (a, s)

Каждый раз, когда вы применяете runState к значению типа State s a, результатом является функция типа s -> (a,s). И первым аргументом этой функции является начальное значение переменной состояния (типа s).

В учебном примере

  • chncasewst3 'e' 'd' 'f' имеет тип State Bool String.
  • Итак, runState (chncasewst3 'e' 'd' 'f') имеет тип Bool -> (String, Bool).
  • Итак, runState (chncasewst3 'e' 'd' 'f') False имеет тип (String, Bool).

Дальнейшее чтение:

...