我有以下代码,我使用 SML/NJ:
signature STACK=
sig
type 'a Stack
val empty :'a Stack
val isEmpty : 'a Stack -> bool
val cons : 'a*'a Stack -> 'a Stack
val head : 'a Stack ->'a
val tail : 'a Stack -> 'a Stack
val ++ : 'a Stack * 'a Stack -> 'a Stack
end
structure List : STACK =
struct
infix 9 ++
type 'a Stack = 'a list
val empty = []
fun isEmpty s = null s
fun cons …Run Code Online (Sandbox Code Playgroud) 在 C# 中,您可以编写string.Join和String.Join。但在 F# 中你不能写 string.Join,只能写 String.Join。这是为什么?string 不是 .NET String 类的类型别名吗?
在foldl定义可能错误的SML/NJ 110.75中,我发现这种关系foldl (op -) 2 [1] = foldr (op -) 2 [1]成立.但是当我在Haskell中尝试上述操作时,我发现Haskell中重写的上述关系foldl (-) 2 [1] == foldr (-) 2 [1]并不成立.为什么是这样?Haskell对折叠的定义是否与SML/NJ不同?
谢谢
import Data.Vector hiding((++))
import System.Environment
d = generate 1000000 (\z->case z of
0 -> 2
1 -> 3
2 -> 5
otherwise -> if odd z then (d ! (z-1)) +2 else (d ! (z-1)) + 4)
algorithmA _ _ 1 pt = pt
algorithmA t k n pt = let dk = d ! k
q = div n dk
r = mod n dk
in if r /=0 then
if q>dk then
algorithmA t (k+1) n pt
else …Run Code Online (Sandbox Code Playgroud) 我喜欢F#中的Int32.TryParse函数,我想在Haskell中创建自己的函数:
import qualified Control.Exception as CE
handler:: CE.ErrorCall -> IO (Bool,Int)
handler e = return (False,0)
s2Int :: String->Int
s2Int s = read s
tryParse :: String -> IO (Bool,Int)
tryParse s = CE.catch (s2Int s `seq` return (True,read s)) handler
Run Code Online (Sandbox Code Playgroud)
解析Int的七行?!有更短的方式吗?
谢谢...
在这个关于镜头好文章加布里埃尔·冈萨雷斯写这样的代码:
import Control.Monad.Trans.Class
import Control.Monad.Trans.State
strike :: StateT Game IO ()
strike = do
lift $ putStrLn "*shink*"
boss.health -= 10
Run Code Online (Sandbox Code Playgroud)
但后来写道
newState^.boss.health
Run Code Online (Sandbox Code Playgroud)
我知道为了修改Statemonad(这里是StateTmonad变换器)你需要使用get函数获取状态,用它做一些事情,然后使用该put函数.但是这里作者没有使用这些功能.同样在第二个例子中,他使用^操作符,这意味着使用boss镜头需要一个Game值.但他在第一个例子中没有这样做.怎么样?
如果我尝试使用通用镜头包中的@符号访问类型的字段,GHC会抱怨启用DataKinds扩展名。您能用简单的英文解释一下generic-lens和DataKinds有什么关系吗?
谢谢
这是我实现Knuth算法M的C++代码,它生成混合基数:
#include "visit.h"
void algorithmM(vector<int>& m)
{
m.insert(m.begin(),2);
const int n=m.size();
vector<int> a(n,0);
M2:
visit(false,a);
int j=n-1;
M4:
if (a[j]==m[j]-1) {a[j]=0;--j;goto M4;}
if (j==0) return;
else {a[j]++;goto M2;}
}
int main()
{
vector<int> m;
int i;
while(std::cin>>i)
{if(i<0) continue;
m.push_back(i);
}
algorithmM(m);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是"visit.h"的代码:
#include <iostream>
#include <vector>
using std::vector;
using std::cout;
template<class T> void visit(bool first,vector<T>& l)
{
size_t dt=first?0:1;
for(typename vector<T>::iterator i=l.begin()+dt;i!=l.end();++i)
cout<<*i;
cout<<'\n';
}
Run Code Online (Sandbox Code Playgroud)
C++代码非常接近Knuth的伪代码.现在,这是使用可变数组的命令式Haskell实现:
import Data.Array.IO
import Control.Monad.State
import Data.IORef
data CountList = CountList …Run Code Online (Sandbox Code Playgroud) 在Windows C ++中,当您要链接到DLL时,必须提供一个导入库。但是在GNU构建系统中,当您想链接.so文件时,就相当于您不希望使用的dll。为什么是这样?是否有等效的Windows导入库。
注意:我并不是说要在Windows中使用GNU C ++的情况,在这种情况下还必须使用导入库。分割线是在Windows C ++和Linux C ++之间。
这是代码#1:
fibs = 0:1:zipWith (+) fibs (tail fibs)
Run Code Online (Sandbox Code Playgroud)
我用list comprehension编写了相同的代码(代码#2):
fibs' = 0:1:[x+y|x<-fibs',y<-tail fibs']
Run Code Online (Sandbox Code Playgroud)
但代码#1产生Fibonnacci数字,而代码#2产生 0 1 1 1 1
为什么会这样?