相关疑难解决方法(0)

申请人撰写,monad没有

申请人撰写,monad没有.

上述陈述是什么意思?什么时候比其他人更好?

monads haskell functional-programming monad-transformers applicative

104
推荐指数
5
解决办法
1万
查看次数

当我尝试去除它时,为什么我的Haskell符号会中断?

我有来自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

13
推荐指数
1
解决办法
560
查看次数

将`do`表示`addStuff`转换为`>> =`

了解一下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,breturn (a+b)所有Int -> Int?我是这么认为的,但我不确定如何bind发挥作用.

我尝试使用它来实现它>>=,但我不确定如何完成它(因此...).

addStuff' :: Int -> Int
addStuff' = (*2) >>= (+10) >>= ...
Run Code Online (Sandbox Code Playgroud)

请给我一个提示来完成它,以及编辑我对do符号版本的理解.

据我了解,... …

haskell

7
推荐指数
1
解决办法
183
查看次数

添加操作而不将结果更改为重构标记

我想在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没有产生合适的结果.实现此功能组合的操作员是什么?

refactoring haskell pointfree do-notation

7
推荐指数
1
解决办法
91
查看次数

是'forM_`惯用的Haskell?

我倾向于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_似乎不是惯用的,但使用似乎很笨拙.有没有惯用的方法来重写这段代码?

haskell

6
推荐指数
1
解决办法
249
查看次数