学习Haskell,我正在尝试编写一个takeIf给定条件和列表的函数来返回满足条件的所有列表元素.
期望输出的示例:
takeIf (>0) [] --> []
takeIf (>0) [-1, 0, 1, 2] --> [1,2]
Run Code Online (Sandbox Code Playgroud)
我试过这个定义:
takeIf cond [] = []
takeIf cond (x:xs) = if (cond x)
then x:(takeIf cond xs)
else []:(takeIf cond xs)
Run Code Online (Sandbox Code Playgroud)
但它不起作用.
我的第一个问题是:我有
:t takeIf --> ([a] -> Bool) -> [[a]] -> [[a]]
Run Code Online (Sandbox Code Playgroud)
为什么?为什么不:
:t takeIf --> (a -> Bool) -> [a] -> [a]
Run Code Online (Sandbox Code Playgroud)
如何才能使此代码生效?
这是我得到的错误:

如果有帮助,我正在使用 ghci
我正在尝试学习Haskell,但我在使用monad时遇到问题.
我导入了模块Data.Maybe.
但我不知道如何使用>>=运营商.
鉴于(>>=) :: Monad m => m a -> (a -> m b) -> m b我无法理解如何定义一个函数(a -> m b).
有人可以提供一些教学示例吗?
我有这个Haskell代码部分:
newtype State st a = State (st -> (st, a))
instance Monad (State state) where
return x = let f t = (t,x) in State f
State f >>= g = State (\oldstate ->
let {(newstate, val) = f oldstate;
State f'= g val}
in f' newstate)
Run Code Online (Sandbox Code Playgroud)
我是新来的单子,但我想我如何return和bind在一般情况下工作.
但在上面的例子中我有很多问题:
Monad (State state)状态Monad的名字?它与它有什么关系newtype State ...?return x = let f t = (t,x) in State f哪里t来自?我写了这段代码:
toCouplesFile = do inputFile <- openFile "deletedId.csv" ReadMode
outputFile <- openFile "couples.txt" WriteMode
readAndChange inputFile outputFile
readAndChange i o = do iseof <- hIsEOF i
if iseof then (return o)
else do line <- hGetLine i
hPutStrLn o (show (extractNameAndId line))
readAndChange i o
Run Code Online (Sandbox Code Playgroud)
我想知道是否可以使用一个函数重写此代码,使用类似于此模式的东西:
function x = do ...
label
.....
if ... then label else exit
Run Code Online (Sandbox Code Playgroud) 我有这种数据类型,它应该代表一个表:
data R = R [Bool] deriving Eq -- Row
data T = T [R] deriving Eq -- Table
Run Code Online (Sandbox Code Playgroud)
问题是它允许拥有不同长度的行表,例如:
tab =T [R [True, False, True, True],
R [False, False, True, False],
R [False, False, False, True],
R [False, False]]
Run Code Online (Sandbox Code Playgroud)
是否可以修改数据定义T以强制所有R元素具有相同的长度?
我正在尝试实现类似Scheme的map功能,即
map([X1, X2, ..], Fun) ->[Fun(X1), Fun(X2), ...]
Run Code Online (Sandbox Code Playgroud)
我写了这段代码:
map([], Fun, []).
map([H|T], Fun, [HO|TO]) :- call(Fun, H, HO), map(T,F,TO).
Run Code Online (Sandbox Code Playgroud)
现在,看看这个运行:
?- map([1,2,3], plus(1), X).
X = [2, 3, 4] ;
X = [2, 3, 4] ;
X = [2, 3, 4] ;
X = [2, 3, 4] ;
ERROR: map/3: Arguments are not sufficiently instantiated
Exception: (9) map([3], _G380, _G351) ?
Run Code Online (Sandbox Code Playgroud)
trace它,请在第一个解决方案后停止执行.我有这个代码:
template<typename T>
class Listoid{
private:
std::vector<T> list;
public:
typedef typename std::vector<T>::iterator iterator;
iterator begin() {return list.begin();}
iterator end() {return list.end();}
public:
Listoid(T t) {
list.push_back(t);
}
const T operator [](int i){
return list[i];
}
void addElem(T ne){
list.push_back(ne);
}
friend T cons(T new_elem, Listoid<T> list);
};
template<typename T>
Listoid<T> cons(T new_elem, Listoid<T> list){
Listoid<T> new_list(new_elem);
for(typename Listoid<T>::iterator it = list.begin(), e = list.end();
it != e; ++it){
new_list.addElem(*it);
}
return new_list;
}
int main(){
Listoid<int> lista(312);
lista.addElem(22);
Listoid<int> lista2 …Run Code Online (Sandbox Code Playgroud) 我正在尝试了解Haskell中的Monads.给定数据类型:
data XY a = X a | Y a
Run Code Online (Sandbox Code Playgroud)
我想'X a >>= f'回来'f a','Y a >>= f'只是忽略'f'并返回'Y a'.
这是我写的代码:
4 instance Monad XY where
5 return x = X x
6 (X a) >>= f = f a
7 (Y a) >>= f = Y a
Run Code Online (Sandbox Code Playgroud)
这是我得到的编译器错误:
prog.hs:7:25:
Couldn't match expected type `b' with actual type `a'
`b' is a rigid type variable bound by
the type signature for …Run Code Online (Sandbox Code Playgroud) 这是由以下代码绘制的:
ggplot(mtcars) +
geom_smooth(fill='grey', alpha=0.3, span=0.1, aes(x=mpg, y=hp, color='AAA',linetype='AAA')) +
geom_smooth(fill='grey', alpha=0.3, span=0.9, aes(x=mpg, y=hp, color='BBB',linetype='BBB')) +
scale_colour_manual(name='test', values=c('AAA'='chocolate', 'BBB'='yellow')) +
scale_linetype_manual(name='test', values=c('AAA'='dashed','BBB'='solid')) +
theme_minimal() +theme(legend.position = "top")
Run Code Online (Sandbox Code Playgroud)
问题:从图例中很难理解“AAA”线是虚线,因为盒子太小了。
我怎样才能放大它?