在Java中,我们可以从类中创建对象/实例.在Haskell中,我们可以从类型类创建实例,例如:
data ShirtSize = S | M | L -- Here ShirtSize is a enum data-type
class MyEq a where
(==) :: a -> a -> Bool
instance MyEq ShirtSize where -- Here ShirtSize is an instance of the MyEq type-class
S == S = True
M == M = True
L == L = True
_ == _ = False
Run Code Online (Sandbox Code Playgroud)
这不是同一个问题:在haskell Obs中混淆函数作为functor的实例:我不是在问fmap是如何工作的,我在问Haskell中的实例解法是什么意思.
我的问题是: 实例在haskell中意味着什么?在java中我们可以从类中创建实例,但在haskell中,似乎实例是类型(如ShirtSize),您可以在其上应用类型类函数(例如,来自MyEq 的(==)函数).我对吗?还有什么是Haskell中的实例与Java中的实例/对象相比?
在java中我们总是写:
public static void main(String[] args){...}
Run Code Online (Sandbox Code Playgroud)
当我们想要开始编写程序时.
我的问题是,对于Haskell,IE是否相同:我是否总是可以确定声明:main = do,当我想在Haskell中为程序编写代码时?
例如:
main = do
putStrLn "What's your name?"
name <- getLine
putStrLn ("Hello " ++ name)
Run Code Online (Sandbox Code Playgroud)
该程序将询问用户"你叫什么名字?" 然后,用户输入将存储在name-variable中,并且在程序终止之前将显示"Hello"++名称.
导出堆栈溢出的定义是:
"在Haskell中,派生实例是一个与数据或newtype声明一起自动生成的实例声明.派生实例声明的主体是从关联类型的定义中语法派生的."
说实话,我真的不明白.
以下代码取自:链接
data BaseballPlayer = Pitcher
| Catcher
| Infielder
| Outfielder
deriving Show
barryBonds :: BaseballPlayer -> Bool
barryBonds Outfielder = True
barryInOf = print(barryBonds Outfielder)
Run Code Online (Sandbox Code Playgroud)
我的问题是,派生语句在这个特定情况下做了什么,以及派生语句一般做了什么?
这个问题并不重复: 如何在haskell OBS 中推导出工作:我不是在询问它的源代码是如何工作的,我在问它是做什么的.
嗨,我想在haskell中定义一个main函数,类似于java中的main函数
main :: String -> IO()
main args = do
putStrLn args
Run Code Online (Sandbox Code Playgroud)
但是当我尝试运行程序时,这会给我一个错误.
我有以下代码(IN VUE.JS):
<template>
<router-link
id="router-link"
>
</router-link>
</template>
Run Code Online (Sandbox Code Playgroud)
<script>
?
</script>
Run Code Online (Sandbox Code Playgroud)
<style scoped>
#router-link{
border: 2px solid black;
width: 100px;
}
</style>
Run Code Online (Sandbox Code Playgroud)
问题:
即使我将宽度设置为 100px,router-link也不会改变它的宽度大小。
有人可以帮助我理解为什么这不起作用以及是否有可能的解决方案?
所以我最近一直在研究monad,我对Haskell编程语言很新.
这是我的代码:
import Data.List
import System.IO
f :: Int -> (Int, [Char])
f x = (x, ['a'])
g :: Int -> (Int, [Char])
g y = (y, ['b'])
(>>=) :: (Int -> (Int, [Char])) -> (Int -> (Int, [Char])) -> Int -> (Int, [Char])
(>>=) f1 f2 a = f1 (fst (f2 a))
h :: Int -> (Int, [Char])
h x = (>>=) g f x
Run Code Online (Sandbox Code Playgroud)
GHCI编译器显示:错误:
Ambiguous occurrence `>>='
It could refer to either `Prelude.>>='
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?我是否以正确的方式使用monad?
我有两个线程,一个 id 0,另一个 id 1。根据这些信息,我尝试构造一个锁,但似乎死锁,但我不明白为什么,有人可以帮助我吗?
我试图构建一个发生这种情况的场景,但这真的很难
private int turn = 0;
private boolean [] flag = new boolean [2];
public void lock(int tid) {
int other;
other = (tid == 0) ? 1 : 0;
flag[tid] = true;
while (flag[other] == true) {
if (turn == other) {
flag[tid] = false;
while (turn == other){}
flag[tid] = true;
}
}
}
public void unlock(int tid) {
//turn = 1-t;
turn = (tid == 0) ? 1 : 0;
flag[tid] = …Run Code Online (Sandbox Code Playgroud) 例如:
f :: (b -> c) -> (a -> b) -> c
g h
Run Code Online (Sandbox Code Playgroud)
函数f将两个函数(我们称之为g和h)作为输入参数,并返回一个c类型的值
第一个参数:(a -> b)
第二个参数:(b -> c)
返回:类型的值c
为了使此函数定义为真,类型必须排列,如下所示:(a -> b) -> (b -> c)<=等效于=>a -> c
并且唯一的方法是将第二个参数用作第一个参数的输入,例如g(h(x)),其中x是a类型,对于Haskell中的所有函数都是如此?换句话说,正确的参数总是被定义为其左参数的输入?这是Haskell中所有组合函数的一般情况吗?如果是这样,我应该始终从右到左而不是从左到右阅读和解释函数参数?
OBS:这个问题与以下问题不同: 为什么点在haskell中从右到左构成 因为我的问题对于所有函数都更通用,我也已经知道由其他函数组成的函数被称为函数组合,而我了解点功能等
如何在Haskell中检查文本文件是否为空?
我已经尝试过了:
main = do
contents <- getContents
if null contents then do
putStrLn "File was empty"
return()
else do
putStrLn "File was not empty"
return
Run Code Online (Sandbox Code Playgroud)