@匿名希望S has joined the channel
:
とは何のことですか。 • タプルとは何ですか。 stack new stack240529
というコマンドで新規プロジェクトを作成したのですが、./app/Main.hs
の3行目でimportエラーがでてしまっています。PATH
に入っている方のGHC)とstackがインストールしたGHC両方があるせいで混乱しちゃってますね(関連: https://docs.haskellstack.org/en/stable/Stack_and_VS_Code/ )。stack path --global-config
を実行するとstackの設定ファイルへのパスが出てくるので、そのファイルを編集して、install-ghc: false system-ghc: true
instance Monad ((->) r) where return = const h >>= f = \w -> f (h w) w
ghci> f = (+1) >>= \a -> (+2) >>= \b -> return (a+b) f :: Num b => b -> b ghci> f 1 5 it :: Num b => b
h w
は (+1) 1
に置き換えられると考えています。(+2) ((+1) 1) 1
になってしまいますが<-
の挙動について質問させてください。newtype State s a = State { runState :: s -> (a,s) } instance Monad (State s) where return a = State $ \s -> (a, s) (State h) >>= f = State $ \s -> let (a, newState) = h s (State g) = f a in g newState pop = State $ (\(a:s) -> (a,s))
steps :: State [Int] Int steps = do a <- pop return a f = runState steps [1..5]
Main> :set +t Main> :l b.hs Main> f (1,[2,3,4,5]) :: (Int,[Int])
a <- Just a
の場合は Just
が外れて a
が取り出されている。と理解しやすいです。Monad (State s)
の定義と矛盾するような気がするので、違うのかと考えています。a
の場合、`a` の位置にあるものが <-
により取り出される。foldr (+) 0 [1..3]
foldr ( (+) 1 0 ) 0 (2:3:[]) foldr ( (+) ((+) 1 0) 2 ) 0 (3:[]) foldr ( (+) ((+) ((+) 1 0) 2) 3 ) 0 ([]) foldr ( (+) ((+) 1 2) 3 ) 0 ([]) foldr ( (+) 3 3 ) 0 ([]) --> 6
>>=
について質問させてくださいimport System.Random rnd_select :: [a] -> Int -> IO [a] rnd_select xs n = do let l = length xs - 1 ys <- sequence . replicate n $ (randomRIO (0, l) :: IO Int) return $ map (xs !!) ys
ghci> rnd_select "abcdefgh" 3 >>= putStrLn efc it :: ()
rnd_select xs n = f >>= return . map (xs !!) where l = length xs - 1 f = sequence . replicate n $ (randomRIO (0, l) :: IO Int)
f
の部分を (where 句ではなく) 直接書いて以下のように変更しました。rnd_select xs n = sequence . replicate n $ (randomRIO (0, l) :: IO Int) >>= return . map (xs !!) where l = length xs - 1
ghci> :l d [1 of 2] Compiling Main ( d.hs, interpreted ) d.hs:5:86: error: [GHC-83865] • Couldn't match type '[Int]' with 'Int' Expected: Int -> a Actual: [Int] -> [a] • In the second argument of '(.)', namely 'map (xs !!)' In the second argument of '(>>=)', namely 'return . map (xs !!)' In the second argument of '($)', namely '(randomRIO (0, l) :: IO Int) >>= return . map (xs !!)' | 5 | rnd_select xs n = sequence . replicate n $ (randomRIO (0, l) :: IO Int) >>= return . map (xs !!) | ^^^^^^^^^^^ Failed, no modules loaded.
[Int]
ではなく Int
が要求されているようだったので、以下のように変更したところrnd_select xs n = sequence . replicate n $ (randomRIO (0, l) :: IO Int) >>= return . (xs !!) where l = length xs - 1
[コード4]
のような違いが出る理由が理解できませんでした。import Control.Exception import Control.Monad import System.Directory import System.Posix.Files import System.Posix.Types lessThan :: FileOffset -> FilePath -> IO Bool lessThan threshold path = do s <- getFileStatus path return $ and [isRegularFile s, fileSize s < threshold] smallFiles :: FileOffset -> FilePath -> IO (Either String [FilePath]) smallFiles threshold dir = do ei <- try (listDirectory dir) case ei of Left (e::SomeException) -> return $ Left (displayException e) Right contents -> do paths <- filterM (lessThan threshold) contents return $ Right paths
ghci> smallFiles 100 "." Right ["retry.hs",".gitignore","oop.hs"] it :: Either String [FilePath]
ghci> f = ((+1) .) . (+) f :: Num c => c -> c -> c ghci> f 1 2 4 it :: Num c => c
f a b = (+1) $ (+) a b
のように展開されるようなイメージになります。ghci> f a b = (+1) $ (+) a b f :: Num a => a -> a -> a ghci> f 1 2 4 it :: Num a => a
:
とは何のことですか。 • タプルとは何ですか。 | m -> s
が気になりました。class (Monad m) => MonadState s m | m -> s where get :: m s put :: s -> m ()
"->" の左側にある型によって右側の型が一意に決定されるそれ以外にも説明のあるところもあったのですが、納得したといえるほど理解できませんでした。
read "123" :: Int
:: Int
がないと "123" がなんの型かわからないよね。import Control.Monad (join) f = join f (*) 5 --> 25 = 5 * 5
join :: (Monad m) => m (m a) -> m a join x = x >>= id
join (*) = (*) >>= id
h >>= f = \w -> id ((*) w) w
id ((*) 5) 5 ==> (*) 5 5
= id` のようなものを見て、それが関数モナド ((->) r) であると導き出すのは経験しかないのでしょうか ?
empty
をテキスト検索で探しています。