小编Car*_*mey的帖子

'(( - >)a)'是什么意思?

我之前看过这种类型而不知道它的含义.它是否意味着什么和/或它有名字?

Prelude> :m Data.Functor
Prelude Data.Functor> :t flip . (flip (<$>))
flip . (flip (<$>))
:: Functor ((->) b) => (b -> a) -> b -> (a -> c) -> c
Run Code Online (Sandbox Code Playgroud)

haskell types type-constructor

8
推荐指数
3
解决办法
331
查看次数

是否可以安装多个ghc并更改每个安装的二进制名称?

假设我想使用不同版本的GHC,每个版本都有不同的二进制名称.

问题1.我可以使用的./configure --prefix = GHC-一些版本,目录为每个设备,并创建符号链接ghc-7.4.1,ghc-7.6.2,ghc-head没有问题?

也就是说,在从源代码安装和创建二进制文件之后.构建项目及其依赖项仍然需要使用虚拟环境.

问题2.什么阻止我们将ghc上传到Hackage,其包名ghc-version具有取决于其版本的二进制名称?例如,可以在〜/ .cabal/bin中cabal install ghc-version-7.6.2获取二进制文件ghc-7.6.2

haskell

8
推荐指数
1
解决办法
619
查看次数

显示类型A - > A.

data A = Num Int
     | Fun (A -> A) String deriving Show

instance Show (Fun (A -> A) String) where
  show (Fun f s) = s
Run Code Online (Sandbox Code Playgroud)

我想有一个函数的属性A -> A来打印它,因此有一个String类型参数Fun.当我把它加载到ghci中时,我得到了

/home/kmels/tmp/show-abs.hs:4:16:
    Not in scope: type constructor or class `Fun'
Run Code Online (Sandbox Code Playgroud)

我想这可以通过添加新的数据类型来实现

data FunWithAttribute = FA (A -> A) String 
Run Code Online (Sandbox Code Playgroud)

添加data A = Num Int | Fun FunWithAttribute和写入instance Show FunWithAttribute.附加数据类型是否可以避免?

haskell typeclass

6
推荐指数
2
解决办法
196
查看次数

重写树木

我有一个表示类型签名的数据结构,这个数据结构是在第一个图片中作为红色示例的树.我想得到黑色的,到目前为止我只得到了橙色的(第二张图片),这是类型树但与左边相关联.

在此输入图像描述

这是我到目前为止的橙树(遵循橙色箭头)

在此输入图像描述

我通过漂亮打印树然后用解析器组合器解析它来解决了这个问题,但这种效率低下是不可取的.我想我可以有另一种算法从橙树转换为黑树,但如果不是组合两种算法,我只能写一种算法会更好.

我将此标记为Haskell,因为我正在编写我的解决方案.我可以提供代码来获取像红树这样的数据结构,但我认为它只会使解决方案的尝试复杂化.

我想知道这个算法是否有名称和/或红树中操作员位置的名称是什么.是前缀吗?

谢谢.

tree computer-science binary-tree haskell

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

方法"|"中预期的解析器类型

我有针对scala 2.8.0编译的以下代码:

import scala.util.parsing.combinator.{syntactical,PackratParsers}
import syntactical.StandardTokenParsers

object MyParser extends StandardTokenParsers with PackratParsers{
  lexical.reserved ++= Set("int","char","boolean")

  lazy val primitiveType:PackratParser[PrimitiveType[_]] = primitiveChar | primitiveInt | primitiveBool

  lazy val primitiveInt:PackratParser[PrimitiveType[Int]] = "int" ^^ { _ => PrimitiveType[Int]() }

  lazy val primitiveChar:PackratParser[PrimitiveType[Char]] = "char" ^^ { _ => PrimitiveType[Char]() }

  lazy val primitiveBool:PackratParser[PrimitiveType[Boolean]] = "boolean" ^^ { _ => PrimitiveType[Boolean]() }
}

object MyParser2 extends StandardTokenParsers with PackratParsers{
  lexical.reserved ++= Set("int","char","boolean")

  lazy val primitiveType:PackratParser[PrimitiveType[_]] =  primitiveChar | primitiveIntOrBool

  lazy val primitiveIntOrBool:PackratParser[PrimitiveType[_]] = "int" ^^ …
Run Code Online (Sandbox Code Playgroud)

scala parser-combinators

4
推荐指数
1
解决办法
300
查看次数

在两个不同的模块中定义一个函数,或者一个变通方法

evalExpression :: Exp -> Value在一个模块A中有一个函数,它在很大程度上依赖于参数上的模式匹配Exp.

该文件已经变得足够大,需要更多的组织.我想将模块划分A成模块A.GHC.Num,A.GHC.Types等等.

  • 有没有办法在GHC中内联另一个模块?我尝试这样做,但我得到错误"模块导入形成一个循环"

要么

  • 有没有办法在两个不同的文件中写入相同的模块?

要么

  • 我可以定义一个A.evalExp尝试(在try和catch的意义上)返回值的函数,A.GHC.Num.evalExp如果它缓存错误(非穷举模式匹配),尝试返回 A.GHC.Types.evalExp,等等?

更新:

我尝试解决循环依赖,但GHC不相信,它说"模糊发生".

haskell ghc

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

Monad变压器用于理解

考虑:

def xs(c: String): Option[List[Long]] = ...

val ys: Stream[Long] = ...
Run Code Online (Sandbox Code Playgroud)

现在我写一个类似的方法:

def method(oc: Option[String]): Option[Long] = for { 
    c <- oc
    list <- xs(c)
} yield{        
    for {
        first <- ys.find(list contains _)
    } yield first
}
Run Code Online (Sandbox Code Playgroud)

但当然这不会编译,因为推断类型是Option [Option [Long]].

在scala语法和标准库方面有没有办法获得Option [Long]?我知道我可以模式匹配,但是问题是否只能用于理解才能完成.


感谢tenshi的答案,这就完成了工作,但是我刚刚遇到了另一个问题的例子:

class T
class U
class A(t: String)(implicit x: T)
def getU(a: A): Option[U] = ...

def getU_2(oc: Option[String]): Option[U] = for{
   c <- oc
} yield{
   implicit val someImplicit: T = new T
   val a …
Run Code Online (Sandbox Code Playgroud)

scala monad-transformers for-comprehension

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