如果我有三个数据类型命名Expr,Op并Fu像这样.
data Expr = Num Double
| X
| Operator Op Expr Expr
| Function Fu Expr
deriving (Eq)
data Op = Add | Mul
deriving (Eq)
data Fu = Sin | Cos
deriving (Eq)
Run Code Online (Sandbox Code Playgroud)
我应该做的是稍后根据数据类型创建一个表达式.例如
let anExpr = Add (Num 3.0) (Num 4.0)
Run Code Online (Sandbox Code Playgroud)
而且打印出相应的表达式,在这种情况下它应该只是"3.0 + 4.0".
我面临的问题是创建另一种类型或数据类型来识别它是否应该打印出来的加法或乘法符号.我想做的是在伪代码中这样的事情
printOut (Num n) = show n
printOut X = "x"
printOut (Op a b) = printOut a ++ 'printOutRightOp' ++ printOut b
printOut (Fu a) = …Run Code Online (Sandbox Code Playgroud) 我正在寻找的是函数的解密crypt(3)函数。阅读手册,他们只推荐我查看login(1), passwd(1), encrypt(3), getpass(3), passwd(5),但据我所知,它们中没有一个可用于解密字符串。
我一起写了一个小程序来说明我的观点,我要找的功能是 somefunctogetbackplaintext(...)
#define _XOPEN_SOURCE
#include <unistd.h>
#include <string.h>
#include <stdio.h>
int
main(int argc, char *argv[])
{
char *cryptated = crypt(argv[1], "aa"); // Password and salt
if(strcmp("somepassword", somefunctogetbackplaintext(argv[1], cryptated, "aa"))) //Plain text, cryptated string, salt
{
printf("Success!\n");
}
else
{
printf("Not a success!\n");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud) 编写此代码是否有更简单,更有效的方法?这是一个计算吸烟成本的计算器.
必须有一种方法可以跳过所有if和elif标签,并使其成为一个循环并节省几分钟的代码输入,甚至可能有一个"标准"如何输入我错过的代码.
how_many = int(input('How many ciggaretes do you smoke each day?\n'))
per_package = int(input('How much does your package cost?\n'))
contain = int(input('How many ciggaretes does the package contain?\n'))
cost_st = per_package / contain
choice = input('Do you want to calculate the cost per "Day (D)" / "Week (W)" / "Year (Y)" / "Decade (DE)"?\n')
if choice == 'D':
cost_day = cost_st * how_many
print("It will cost", cost_day ,"kr per day.")
elif choice == 'W':
cost_week …Run Code Online (Sandbox Code Playgroud) 我该怎么做呢?我想要一些sevenList :: Gen [Integer]产生列表的结构,并且保证总是包含至少一个7.
我知道如果我想生成一个大小为n的列表,我可以这样做:
listOfLength n gen = sequence [ gen | i <- [1..n] ]
Run Code Online (Sandbox Code Playgroud)
但这还不够,因为如果我生成一个长度为10的列表并且没有生成7,我必须继续,但此刻它不会.
我参加了面向机器编程的课程,在引用内存地址时,我在理解数据类型时遇到了一些问题.例如,如果我想访问位置0x40020000上的一块内存.我会这样写的.
#define NAME_OF_THE_REGISTER *((unsigned int *)(0x40020000))
Run Code Online (Sandbox Code Playgroud)
但是使用其他一些数据类型有什么区别?例如unsigned short或unsigned char.我知道它们有不同的范围,但是如果我将这个特定代码更改为unsigned short,我仍然可以访问内存,一切正常.
在我的大学提供的"示例"代码中,他们似乎喜欢在unsigned char,volatile unsigned char,unsigned int,volatile unsigned int等之间切换,我无法弄清楚原因.例
#define PORT 0x40020000
#define PORTNAME ((volatile unsigned int *) (PORT))
#define PORTOFFSET1 ((volatile unsigned short *) (PORT + 0x4)) //offset to access Output register
Run Code Online (Sandbox Code Playgroud)
使用它们之间的优点和缺点是什么?
例.我有一个列表,比如[1,2,3],我想把它附加到列表列表中,所以它看起来像这样.
[[5,5,5],[6,6,6]] -> [[1,2,3],[5,5,5],[6,6,6],[1,2,3]]
Run Code Online (Sandbox Code Playgroud)
我该如何做到这一点?我不能做这样的事情
funk listOfList = [1,2,3] ++ listOfList ++ [1,2,3]
Run Code Online (Sandbox Code Playgroud)
要么
funk [listOfList] = [[1,2,3], listOfList, [1,2,3]]
Run Code Online (Sandbox Code Playgroud)
说实话,我不知道.
试图理解malloc和calloc,所以我看了一些TheNewBoston关于这个主题的视频.但由于某种原因,我得到一个非常奇怪的输出,让我展示代码开始.
#include <stdio.h>
#include <stdlib.h>
int
main()
{
int i, howMany;
int total;
float average = 0.0;
int * pointsArray;
printf("How many do you want to store: \n");
scanf("%d", &howMany);
pointsArray = (int *) malloc(howMany * sizeof(int));
printf("Enter your numbers: \n");
for(i = 0; i < howMany; i++)
{
scanf("%d", &pointsArray[i]);
total += pointsArray[i];
}
average = (float)total / (float)howMany;
printf("Average is: %f\n", average);
free(pointsArray);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它应该计算您输入的数字的平均值.问题是由于某种原因,变量"total"的值得到起始值4195808.首先,我对TheNewBoston的代码做了一个自己的"解释",但是在我得到这个错误后我才复制它,但同样的问题仍然存在.为什么会这样?我找不到任何有类似问题的人的信息.
我想做的是从函数 f 返回一对。我想制作一对两个函数,pf。然后实现 f2p 变换。
\nf :: a -> (b,c)\npf :: (a->b,a->c)\nf2p :: (a -> (b,c)) -> (a->b,a->c)\nRun Code Online (Sandbox Code Playgroud)\n我发现这非常困难,我认为我应该以某种方式使用函数组合,但问题似乎很奇怪。我所尝试的只是为 f 创建一个虚拟函数,如下所示。
\nf n = (n,n+1)\nRun Code Online (Sandbox Code Playgroud)\n只是为了能够与其他两个功能一起工作。但是当我开始编写函数 pf 时,无论我做什么,我都无法使其像定义所希望的那样工作。例如,
\npf = (fst a, snd a)\n where a = f 3\nRun Code Online (Sandbox Code Playgroud)\n这只是将其变成 pf :: (Integer, Integer),这并不是我真正想要的。如果我尝试用 pf :: (Num t) => (t->t,t->t) 强制它,我得到
\n\n\n无法推断出因使用 \xe2\x80\x98f\xe2\x80\x99 而产生的 (Num (t -> t))
\n
我真的需要一些指导!
\n