我在 haskell 程序中使用决策图库。为此,我想声明 2 种不同的(新)类型来跟踪我正在处理的决策图。我使用的库是 cudd,决策图基类型有一个 DdNode,但我的问题仅与 Haskell 相关。
newtype Bdd = ToBdd Cudd.Cudd.DdNode
newtype Zdd = ToZdd Cudd.Cudd.DdNode
Run Code Online (Sandbox Code Playgroud)
通常我想在调用函数时区分它们,但现在我想使用一个不必区分这两种类型的函数。我主要尝试通过 3 种不同的方式来解决这个问题:
data Dd = ToBdd Bdd | ToZdd Zdd
printDdInfo :: Dd -> IO()
printDdInfo (ToZdd dd) = do
putStrLn "Hello, zdd!"
Cudd.Cudd.cuddPrintDdInfo manager dd
printDdInfo (ToBdd dd) = do
putStrLn "Hello, bdd!"
Cudd.Cudd.cuddPrintDdInfo manager dd
printDdInfo :: Either Bdd Zdd -> IO()
printDdInfo (ToZdd dd) = do
putStrLn "Hello, zdd!"
Cudd.Cudd.cuddPrintDdInfo manager dd
printDdInfo (ToBdd dd) = do …Run Code Online (Sandbox Code Playgroud) 我正在尝试将 Scala 的推导式与Either类型结合使用,即使用Right. 然而,尽管我付出了努力,我还是收到错误并且没有任何效果。
我正在使用 scala 的 repl 进行一些测试。这是我能想到的最简单的用例:
scala> for {
| x <- Right(1)
| y <- Right(2)
| z <- Right(3)
| } yield x + y + z
Run Code Online (Sandbox Code Playgroud)
您会看到它基本上是此页面的副本:
https://www.scala-lang.org/api/2.12.7/scala/util/Either.html
但是,此操作失败并出现以下错误:
<console>:13: error: value flatMap is not a member of scala.util.Right[Nothing,Int]
x <- Right(1)
^
<console>:14: error: value flatMap is not a member of scala.util.Right[Nothing,Int]
y <- Right(2)
^
<console>:15: error: value map is not a member of scala.util.Right[Nothing,Int] …Run Code Online (Sandbox Code Playgroud) 如果Either fmap是的话
(a -> b) -> p a a -> p a b
一旦Left返回,它将停止映射.
函数的名称或类型签名在获得Right结果之前不会停止.
我怀疑是一个bifunctor,但我真的需要它拼出来 - 不太明白这些东西的逻辑.
也许某种形式也fold适合......
我似乎无法编写一个简单的haskell函数来获取Either输入并使用它.这是我写的:
$ cat main.hs
module Main( main ) where
-- myAtoi :: Either String Int -> Int
myAtoi :: Int -> Int
myAtoi _ = 700
main :: IO ()
main = do
print(myAtoi(8))
Run Code Online (Sandbox Code Playgroud)
这显然工作正常:
$ ghc main.hs -o main
$ ./main
700
Run Code Online (Sandbox Code Playgroud)
但是当我删除评论并使用第一个签名时,我收到以下错误:
[1 of 1] Compiling Main ( main.hs, main.o )
main.hs:9:14: error:
• No instance for (Num (Either String Int))
arising from the literal ‘8’
• In the first argument of ‘myAtoi’, namely ‘(8)’
In …Run Code Online (Sandbox Code Playgroud)