申请人撰写,monad没有.
上述陈述是什么意思?什么时候比其他人更好?
monads haskell functional-programming monad-transformers applicative
我有来自99个Haskell问题的问题26的以下代码:
combinations :: Int -> [a] -> [[a]]
combinations 0 _ = return []
combinations n xs = do y:xs' <- tails xs
ys <- combinations (n-1) xs'
return (y:ys)
Run Code Online (Sandbox Code Playgroud)
上面的代码按预期工作.以下是我的主要功能和打印结果:
main = print $ combinations 2 "abcd"
-- Prints: ["ab","ac","ad","bc","bd","cd"]
Run Code Online (Sandbox Code Playgroud)
作为一个学习练习,我试图"desugar"这样的记号:
combinations :: Int -> [a] -> [[a]]
combinations 0 _ = return []
combinations n xs = tails xs >>= \(y:xs') ->
do
ys <- combinations (n-1) xs'
return (y:ys)
Run Code Online (Sandbox Code Playgroud)
这会编译,但在运行时会出现以下错误:
PatternMatchFail: /home/.../test.hs:(46,34)-(49,37): Non-exhaustive …Run Code Online (Sandbox Code Playgroud) 了解一下Haskell提供的addStuff功能:
import Control.Monad.Instances
addStuff :: Int -> Int
addStuff = do
a <- (*2) -- binds (*2) to a
b <- (+10) -- binds (+10) to b
return (a+b) -- return has type sig: 'Monad m => a -> m a'
Run Code Online (Sandbox Code Playgroud)
是的类型a,b和return (a+b)所有Int -> Int?我是这么认为的,但我不确定如何bind发挥作用.
我尝试使用它来实现它>>=,但我不确定如何完成它(因此...).
addStuff' :: Int -> Int
addStuff' = (*2) >>= (+10) >>= ...
Run Code Online (Sandbox Code Playgroud)
请给我一个提示来完成它,以及编辑我对do符号版本的理解.
据我了解,... …
我想在Haskell中依次组合两个monad动作,丢弃第二个动作产生的任何值,并将参数传递给两个动作.目前我正在使用这样的do-block:
ask = do
result <- getLine
putStrLn result
return result
Run Code Online (Sandbox Code Playgroud)
我本来希望写一点免费和整洁,所以我尝试了这个:
ask' = getLine <* putStrLn
Run Code Online (Sandbox Code Playgroud)
但是,这甚至不进行类型检查,问题是<*不会将第一个动作的结果传递给第二个动作.我希望将操作链接起来>>=,但不会更改结果.类型应该是(a -> m b) -> (a -> m c) -> (a -> m b),但Hoogle没有产生合适的结果.实现此功能组合的操作员是什么?
我倾向于forM_在Haskell中使用它,就像.each在Ruby或foreachScala中一样.
import Control.Monad (forM_)
import Network.BSD (getHostByName, hostAddresses)
import Network.Socket (inet_ntoa)
import System.Environment (getArgs)
resolve address = do
ent <- getHostByName address
mapM inet_ntoa (hostAddresses ent)
main = do
args <- getArgs
args `forM_` (\address -> do
ips <- resolve address
ips `forM_` (\ip -> putStrLn $ address ++ "\t" ++ ip))
Run Code Online (Sandbox Code Playgroud)
它对我来说mapM_似乎不是惯用的,但使用似乎很笨拙.有没有惯用的方法来重写这段代码?