小编Dra*_*gno的帖子

如何使用 SML 模块中的中缀运算符?

我有以下代码,我使用 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)

smlnj

5
推荐指数
1
解决办法
3283
查看次数

为什么在 F# 中可以写 String.Join 而不能写 string.Join?

在 C# 中,您可以编写string.JoinString.Join。但在 F# 中你不能写 string.Join,只能写 String.Join。这是为什么?string 不是 .NET String 类的类型别名吗?

f#

5
推荐指数
1
解决办法
90
查看次数

Haskell和SML/NJ中的不同折叠

foldl定义可能错误的SML/NJ 110.75中,我发现这种关系foldl (op -) 2 [1] = foldr (op -) 2 [1]成立.但是当我在Haskell中尝试上述操作时,我发现Haskell中重写的上述关系foldl (-) 2 [1] == foldr (-) 2 [1]并不成立.为什么是这样?Haskell对折叠的定义是否与SML/NJ不同?

谢谢

haskell smlnj fold

4
推荐指数
2
解决办法
453
查看次数

为什么我在Haskell中收集堆栈溢出的消息?

 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)

stack-overflow haskell

3
推荐指数
1
解决办法
166
查看次数

在Haskell中实现FSharp的Int32.TryParse

我喜欢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的七行?!有更短的方式吗?

谢谢...

f# haskell

3
推荐指数
2
解决办法
332
查看次数

使用没有"get"功能的状态monad

这个关于镜头好文章加布里埃尔·冈萨雷斯写这样的代码:

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值.但他在第一个例子中没有这样做.怎么样?

haskell

3
推荐指数
1
解决办法
89
查看次数

通用镜头与DataKinds GHC扩展之间的关系

如果我尝试使用通用镜头包中的@符号访问类型的字段,GHC会抱怨启用DataKinds扩展名。您能用简单的英文解释一下generic-lens和DataKinds有什么关系吗?

谢谢

haskell

3
推荐指数
1
解决办法
92
查看次数

在Haskell中缩短Knuth的算法M(混合基数)

这是我实现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)

algorithm haskell functional-programming

2
推荐指数
2
解决办法
594
查看次数

相当于Linux中的导入库

在Windows C ++中,当您要链接到DLL时,必须提供一个导入库。但是在GNU构建系统中,当您想链接.so文件时,就相当于您不希望使用的dll。为什么是这样?是否有等效的Windows导入库。

注意:我并不是说要在Windows中使用GNU C ++的情况,在这种情况下还必须使用导入库。分割线是在Windows C ++和Linux C ++之间。

c++ linux windows gnu

2
推荐指数
2
解决办法
886
查看次数

Haskell中的列表理解vs zipWith

这是代码#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

为什么会这样?

haskell

1
推荐指数
1
解决办法
874
查看次数