Я пытаюсь изучить Хаскель. Я написал код, который использует глобальное состояние и может изменять его с помощью двух функций (т. е. change1 и change 2). Кроме того, я включил объектив, чтобы я тоже мог его изучить. Проблема в самой последней строке кода. Я не понимаю, почему я не могу включить две последние строки вместе в main. Он будет работать, если я удалю любой из них.
{-# LANGUAGE TemplateHaskell #-}
module Dd (main, ma, change1,change2, Dp(Dp)) where
import Control.Lens
import Control.Monad.State
import Control.Monad.IO.Class (liftIO)
data Dp = Dp {_sr :: Int , _fl :: Int} deriving (Show)
makeLenses ''Dp
plus :: Dp -> Dp
plus = over (sr) (+90)
mult4 :: Dp -> Dp
mult4 = over (fl) (*100)
change1 :: State Dp ()
change1 = modify plus
change2 :: State Dp ()
change2 = modify mult4
ma :: State Dp ()
ma = do
change1
change2
main = do
runState ma (Dp 2 3)
evalState ma (Dp 2 3)-- here is the problem
Редактировать: я немного смущен: почему приведенный ниже код работает без ошибок?
data Dp = Dp {_sr :: Int , _fl :: Int} deriving (Show)
makeLenses ''Dp
gs :: StateT Dp IO Int
gs = do
d <- gets _sr
liftIO $ print (d)
dd<- uses sr (10<=)
if (dd) then
return (10)
else return (90)
main = do
runStateT gs (Dp 3 6)
evalStateT gs (Dp 3 6)
runState
возвращает(a, s)
, что означает, что вашmain
использует монаду(,) a
.evalState
не возвращает значение в той же монаде, поэтому они не могут быть составлены с использованием нотацииdo
. - person 4castle   schedule 25.07.2017print
результаты, чтобы проверить все типы. - person chi   schedule 25.07.2017main
не имеет типаIO
. - person Daniel Wagner   schedule 26.07.2017runState
возвращает(a, s)
, аrunStateT
возвращаетm (a, s)
, то естьIO (a, s)
здесь. АналогичноIO a
дляevalSTateT
. Теперь обаIO ...
, так что все в порядке. Это по-прежнему не будет выполнять никаких операций ввода-вывода, просто вернет последнее целое число. Вы можете увидеть типы в GHCi с помощью команды:t
в ее приглашении (например,:t runStateT
). - person Will Ness   schedule 26.07.2017