我之前看过这种类型而不知道它的含义.它是否意味着什么和/或它有名字?
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) 假设我想使用不同版本的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
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,因为我正在编写我的解决方案.我可以提供代码来获取像红树这样的数据结构,但我认为它只会使解决方案的尝试复杂化.
我想知道这个算法是否有名称和/或红树中操作员位置的名称是什么.是前缀吗?
谢谢.
我有针对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) 我evalExpression :: Exp -> Value在一个模块A中有一个函数,它在很大程度上依赖于参数上的模式匹配Exp.
该文件已经变得足够大,需要更多的组织.我想将模块划分A成模块A.GHC.Num,A.GHC.Types等等.
要么
要么
A.evalExp尝试(在try和catch的意义上)返回值的函数,A.GHC.Num.evalExp如果它缓存错误(非穷举模式匹配),尝试返回 A.GHC.Types.evalExp,等等?更新:
我尝试解决循环依赖,但GHC不相信,它说"模糊发生".
考虑:
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)