我正在尝试了解s以下类型的情况:
class A a where
f :: a -> s
data X = X
instance A X where
f x = "anything"
Run Code Online (Sandbox Code Playgroud)
我希望这可以工作,认为因为类型s不受任何约束,它可以是任何东西.但编译器说它"无法将预期类型'与实际类型'[Char]'匹配",好像类型s是固定类型,如Int,Char ......
所以我的第二种解释就是说,因为我们s在类型类声明中什么都不知道,所以我们无法确定何时创建X一个实例,我们给出A的函数的返回值是否f匹配类型s.但是有些类使用的抽象数据类型没有绑定到任何没有问题的东西,比如Functor:
class Functor f where
fmap :: (a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)
s当类型a和b这里没有时,为什么类型高于问题?
我想定义一个Torus表示在边界处环绕的2D数组的类.例如,访问索引超出相应维度大小的数组应返回位置处的元素i mod arraysize.因此,我的类只需要定义一个get方法:
class Torus a where
get :: a -> Int -> Int -> b
Run Code Online (Sandbox Code Playgroud)
这个定义是不精确的.a应该是一个2D数组,b应该是数组中包含的类型.我怎么表达这个?
谢谢,
如何为第二个参数someBoundedInt编写一个生成器,它将在为minmaxBound生成的值之间随机生成一个Int?
val boundedIntProperty = forAll {
(minmaxBound: (Int,Int), someBoundedInt: Int) =>
minmaxBound._1 <= someBoundedInt && someBoundedInt <= minmaxBound._2
}
Run Code Online (Sandbox Code Playgroud) 我经常开始考虑要定义的类型类的问题,并且当我开始编码时意识到我不需要类型类并且可以用代数数据类型来解决我的问题,这似乎更直接.结果,我想知道何时需要类型类.
据我了解,类型类是一种说某些类型存在某些函数的方法.例如,当一种类型的MyType是含半幺群的一个实例,然后我可以使用的功能mempty :: MyType和mappend :: MyType -> MyType -> MyType,使得该独异法律保持.
通过将Monoid定义为类型而不是类型类,我们可以使用代数数据类型实现相同的效果:
data Monoid a = Monoid { mempty :: a
, mappend :: a -> a -> a}
Run Code Online (Sandbox Code Playgroud)
然后通过定义类型的新值Monoid MyType(类型类通过声明它是一个实例来完成)来说类型MyType是一个monoid :
monoidMyType :: Monoid MyType
monoidMyType = Monoid { mempty = ...
, mappend = \a b -> ... }
Run Code Online (Sandbox Code Playgroud)
然后,我们可以编写像monoids一样运行的函数:
dummyFun :: Monoid a -> a -> a
dummyFun m x = mempty m x
Run Code Online (Sandbox Code Playgroud)
并通过显式传递适当的"monoid值"来使用这些函数:
result = dummyFun monoidMyType valueOfMyType
Run Code Online (Sandbox Code Playgroud)
与类型类相似的最后两个步骤将非常相似:
dummyFun …Run Code Online (Sandbox Code Playgroud) 我面临一些如下所示的重复数据删除错误,这表明我的某些依赖项导入了包含具有相同路径名的文件的其他依赖项。由于它们具有相同的路径,因此它们不能一起包含在我尝试使用 sbt-assemble 创建的 jar 文件中。
我知道修复它的干净方法是修复我的依赖项。下面的示例中的冲突依赖项似乎是reactive-streams和reactive-streams-flow-adapters,但我不确定它们是什么以及它们来自哪里。我如何找到哪些依赖项正在导入它们?
如果我能弄清楚,我该如何解决它?除了删除其中一个之外,还有其他方法吗?
重复数据删除错误的示例:
[error] (assembly) deduplicate: different file contents found in the following:
[error] /home/guillaume/.cache/coursier/v1/https/repo1.maven.org/maven2/org/reactivestreams/reactive-streams-flow-adapters/1.0.2/reactive-streams-flow-adapters-1.0.2.jar:org/reactivestreams/FlowAdapters$FlowPublisherFromReactive.class
[error] /home/guillaume/.cache/coursier/v1/https/repo1.maven.org/maven2/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar:org/reactivestreams/FlowAdapters$FlowPublisherFromReactive.class
Run Code Online (Sandbox Code Playgroud)
这是我的依赖项列表,如果有帮助的话:
libraryDependencies += "com.fasterxml.jackson.core" % "jackson-databind" % "2.12.2",
libraryDependencies += "com.novocode" % "junit-interface" % "0.11" % "test",
libraryDependencies += "com.softwaremill.sttp.client3" %% "core" % "3.3.6",
libraryDependencies += "com.softwaremill.sttp.client3" %% "httpclient-backend-zio" % "3.3.6",
libraryDependencies += "dev.zio" %% "zio" % "1.0.9",
// libraryDependencies += "dev.zio" %% "zio-streams" % "1.0.9",
libraryDependencies += "org.apache.commons" % "commons-compress" % "1.20",
libraryDependencies …Run Code Online (Sandbox Code Playgroud) 下面是一个程序的示例,该程序采用一个可选参数a,该参数具有换行符的默认值.该程序仅打印唯一参数的值.因此,调用没有参数或使用的程序-a '\n'应该给出相同的值,但它不会:
$ ./myProg
$ ./myProg -a '\n'
\n
Run Code Online (Sandbox Code Playgroud)
问题是当从命令行参数中读取时,换行符会被转义.是否可以使两个调用表现相同?
import Options.Applicative
data Options = Options String
optsParser :: Parser Options
optsParser = Options
<$> strOption
( short 'a'
<> metavar "A"
<> value "\n" )
opts :: IO Options
opts = execParser $ info (helper <*> optsParser) ( fullDesc )
main = do
Options a <- opts
putStrLn $ a
Run Code Online (Sandbox Code Playgroud)