我有一个在IntMap上操作的算法,我觉得最好用必要的方式来表达。也就是说,我想说的是:
查找映射中的值X。如果与标准匹配,则从map.循环中删除该值,直到映射中不再存在值。
将其表示为两行递归非常简单,但是实际的算法要复杂一些,包括几个查找和删除,所以我希望能够用do符号来表示它。
是否有一个标准的" state "-like monad,其中的状态由Data.Map或Data.IntMap表示,我可以这样做:
do
insert 5 20
(ma, mv) <- lookup 4
case mv of
Just v -> delete (fr
在阅读了几十个教程之后,我了解了monads,我正在尝试在JavaScript中实现这种模式。我正在使用和来翻译一些Haskell示例。
因此,作为练习,我试图实现的monad是List monad。我用LiveScript写了以下文章:
List = do ->
# unit :: a -> ma
unit = (a) -> [a]
# bind :: ma -> (a -> mb) -> mb
bind = (ma, f) --> concat (map f) ma
# lift :: (a -> b) -> ma
import Control.Monad
import Data.Char
main = forever $ do
putStr "Give me some input: "
l <- getLine
putStrLn $ map toUpper l
我一直在通过学习haskell来学习Haskell。当我尝试运行这段代码时,它的行为并不像它应该的那样。
l
Give me some input: L
abc
Give me some input: ABC
当我运行它时,它不会先打印字符串,我可以输入。在提供了一些输入之后,在本例中是l,它返回给
我已经看到在Scala中有不同的使用方式,从类似选项的包装器中提取一些值,或者在列表或其他集合上。如果我必须从Option中取出一个块,然后对其进行迭代,这可以在一个for块中完成吗?
例如:
val l: Option[List[Int]] = Some(List(1,2,3,4))
l: Option[List[Int]] = Some(List(1, 2, 3, 4))
for{
li <- l // li taken out from Option wrapper
number <- li // numbers pulled from li
} y
我已经写了下面的Haskell函数,它接受两个一元值,并将它们组合成一个一元值(它只是为了说明Haskell类型系统可以支持的泛型(或泛型)程度)。
combine x y = do
a <- x
b <- y
return (a, b)
我用三种不同的monads对其进行了测试:
main = do
putStrLn $ show $ combine (Just 10) (Just 20) -- Maybe a
putStrLn $ show $ combine [100] [10, 20] -- [] a
a <- combine g
在Haskell中,liftM2可以定义为:
liftM2 :: (Monad m) => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2 f m1 m2 = do
x1 <- m1
x2 <- m2
return $ f x1 x2
我想把它翻译成Scala。我的第一次尝试是这样的:
def liftM2[T1, T2, R, M[_]](f: (T1, T2) => R)(ma: M[T1], mb: M[T2]) : M[R] = for {
a <- ma
b &
是编写以下代码的最简单方法,而无需使用toStream()
import io.vavr.collection.List;
import io.vavr.control.Option;
import lombok.Value;
public class VavrDemo {
public static void main(String[] args) {
Foo bar = new Foo(List.of(new Bar(1), new Bar(2)));
Number value = Option.some(bar)
我正在尝试Cont monad,发现了下面的问题。
首先构造一个无限列表,并将所有元素提升到Cont monad。
使用序列操作在无限列表上获得一个Cont。
例如,当我们尝试使用head运行monad时,它会陷入无限循环,同时试图展开延续,而不会调用head。
代码如下所示:
let inff = map (return :: a -> Cont r a) [0..]
let seqf = sequence inff
runCont seqf head
那么,这是Haskell中Cont实现的一个限制吗?如果是的话,我们如何改善这一点?
我正在寻找一个函数,它基本上类似于列表中的mapM --它执行一系列的一元操作,将列表中的每个值作为参数--每个一元函数返回m (Maybe b)。但是,我希望它在导致函数返回Just值的第一个参数之后停止,然后不再执行,然后返回该值。
那么,只显示类型签名可能会更容易:
findM :: (Monad m) => (a -> m (Maybe b)) -> [a] -> m (Maybe b)
其中b是第一个Just值。结果中的Maybe来自finding (在空列表等情况下),并且与Monadic函数返回的Maybe无关。
我似乎不能用一个简单的库函数来实现这一点。
我有以下代码:
type Mapper a k v = a -> [(k,v)]
type Reducer k v = k -> [v] -> [v]
mapReduce :: Ord k => Mapper a k v -> Reducer k v -> [a] -> [(k,[v])]
mapReduce m r = reduce r . shuffleKeys . concatMap (map listifyVal . m)
where listifyVal (k,v) = (k,[v])
shuffleKeys = Ma
这对Haskell的专业人士来说应该很容易。
我有一个可能的值,
> let a = Just 5
我可以打印出来:
> print a
Just 5
但我想将I/O操作应用到可能的内部。我知道如何在不使用case的情况下做到这一点的唯一方法是:
> maybe (return ()) print a
5
然而,这似乎太冗长了。首先,return ()是特定于I/O monad的,所以我必须为每个我想要尝试此技巧的monad提供一个不同的“0”。
基本上,我希望将I/O操作(打印)映射到可能值上,如果它是Just,则打印它;如果它是Nothing,则不做任何事情。我想以某种方
为了使任何东西在单一环境下都可以操作,如果使用Haskell -我只是为给定类型添加类monad的实现。因此,我根本不触及数据类型定义的源。就像(人为的)
data Z a = MyZLeft a | MyZRight a
swap (MyZLeft x) = MyZRight x
swap (MyZRight x) = MyZLeft x
instance Monad Z where
return a = MyZRight a
(>>=) x f = case x of
MyZLeft s -> swap (f s)
假设我有一个高阶函数,它使用从函数参数中检索到的值来执行一些计算。
f :: a -> (b -> c) -> d
其中a,b,c,d是一些具体的类型。
然后我就有了一个这种类型的函数
g :: b -> m c
其中m是某个单子。
现在有没有一种方法可以把g和f一起使用,也就是把f变成一个函数,它产生m d而不是d,并且可以使用g作为它的第二个参数?
一个具体的例子是,m是IO monad,f是计算从其函数参数中检索到的n个数字的和的函数,g从标准输入中读取一个数字。
f n g = sum $ map g (1..n)
g :: Int -> IO Int
g
我开始从事一个将元胞自动机定义为局部转换函数的项目:
newtype Cellular g a = Cellular { delta :: (g -> a) -> a }
只要g是Monoid,就可以通过在应用本地转换之前转移焦点来定义全局转换。这为我们提供了以下step函数:
step :: Monoid g => Cellular g a -> (g -> a) -> (g -> a)
step cell init g = delta cell $ init . (g <>)
现在,我们可以使用iterate简单地运行自动机。通过mem
我正在为Dart开发一个名为"dfunct“的学习库,并试图传递一个函数,该函数在将函数从A应用到B之后,接受包装的A (Ma)并返回包装的B (Mb),同时确保包装器的类型相同。
我认为这两个例子很适合,但都会触发警告。
typedef R Func1<T, R>(T input); // <-- included for completeness but not related
typedef M<B> Lift<M extends Monad, A, B>(M<A> source, Func1<A, B> map
我使用此函数以下列格式从字符串中读取自然数列表:[1, 2, 3]
readMaybeIntList :: String -> Maybe [Int]
readMaybeIntList line = case readMaybe line of
Just l -> return l
Nothing -> Nothing
现在,它只适用于整数--检查数字是否是自然的正确方法是什么?我是否应该修改Just l子句以检查是否所有数字都是>=0?从这种嵌套的Nothing子句