标签: either

haskell 中 2 个新类型的“或”模式匹配

我在 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)

import haskell either binary-decision-diagram newtype

0
推荐指数
1
解决办法
70
查看次数

正确的做法是不使用 Scala 进行理解

背景

我正在尝试将 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)

monads scala either

0
推荐指数
1
解决办法
208
查看次数

"要么Fmap"继续直到达到正确的结果

如果Either fmap是的话

(a -> b) -> p a a -> p a b

一旦Left返回,它将停止映射.

函数的名称或类型签名在获得Right结果之前不会停止.

我怀疑是一个bifunctor,但我真的需要它拼出来 - 不太明白这些东西的逻辑.

也许某种形式也fold适合......

haskell either

-2
推荐指数
1
解决办法
60
查看次数

Haskell函数与任一输入

我似乎无法编写一个简单的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)

haskell either

-2
推荐指数
1
解决办法
68
查看次数