小编Mat*_*ick的帖子

如何对数据对象进行自动数据序列化?

具有某种反射/内省规范的语言的巨大好处之一是可以从各种来源自动构建对象.

例如,在Java中,我可以使用相同的对象来持久化到db(使用Hibernate),序列化为XML(使用JAXB),以及序列化为JSON(json-lib).您可以在Ruby和Python中执行相同的操作,通常也遵循一些简单的Java属性或注释规则.

因此,我不需要很多"域转移对象".我可以专注于我正在工作的领域.

它似乎在像Haskell和Ocaml这样非常严格的FP中,这是不可能的.特别是Haskell.我唯一看到的是进行某种预处理或元编程(ocaml).只是接受你必须从底部向上进行所有转换吗?

换句话说,您必须做很多无聊的工作才能将haskell中的数据类型转换为JSON/XML/DB Row对象,然后再转换回数据对象.

serialization ocaml haskell

15
推荐指数
3
解决办法
6781
查看次数

纯函数可以有自由变量吗?

例如,一个没有自由变量的引用透明函数:

g op x y = x `op` y
Run Code Online (Sandbox Code Playgroud)

现在是一个带有自由(从观点来看f)变量的函数opx:

x = 1
op = (+)
f y = x `op` y
Run Code Online (Sandbox Code Playgroud)

f也是参考透明的.但它是纯粹的功能吗?

如果它不是纯函数,那么引用透明的函数的名称是什么,但是使用一个或多个绑定在封闭范围内的变量?


这个问题的动机:

维基百科的文章中我不清楚:

结果值不需要依赖于所有(或任何)参数值.但是,它必须仅依赖于参数值.

(强调我的)

也不是从谷歌搜索纯函数是否可以依赖于free(在一个封闭范围中绑定的意义上,而不是在函数范围内绑定)变量.

另外,这本书说:

如果没有自由变量的函数是纯粹的,那么闭包是不纯的吗?

功能function (y) { return x }很有趣.它包含一个自由变量x.自由变量是未在函数内绑定的变量.到目前为止,我们只看到了一种"绑定"变量的方法,即通过传入一个具有相同名称的参数.由于该函数function (y) { return x }没有名为x的参数,因此变量x未在此函数中绑定,这使其"自由".

现在我们知道函数中使用的变量是绑定的还是空闲的,我们可以将函数分为具有自由变量的函数和不具有以下函数的函数:

  • 不包含自由变量的函数称为纯函数.
  • 包含一个或多个自由变量的函数称为闭包.

那么"纯函数"的定义是什么?

haskell functional-programming free-variable pure-function

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

Erlang相当于if else

我有两部分代码要执行.两者都是条件

if Value1 < N do something 

else if Value1 >= N do something

if Value2 < N do something 

else if Value2 >= N do something
Run Code Online (Sandbox Code Playgroud)

我希望每个人都能执行一个声明.

如何在erlang中工作?没有别的.我使用多个警卫,但看起来我有4个if语句.分为2组.

if some condition   
code;

if other condition  
code

end.
Run Code Online (Sandbox Code Playgroud)

我收到语法错误.

erlang if-statement

14
推荐指数
4
解决办法
4万
查看次数

如何列出当前目录中的所有文件

我想要的是写一个Haskell函数来返回当前目录的文件,例如

将当前目录更改为

 :cd c:/code/haskell
Run Code Online (Sandbox Code Playgroud)

然后编写一个函数,返回一组中的文件,例如

 [x | x <-getDirectoryContents ]
Run Code Online (Sandbox Code Playgroud)

编辑:

我写了一个像这样列出文件的函数(参考:http://zvon.org/other/haskell/Outputdirectory/index.html)

import Directory 

main = _dir "/tmp/FOO"

_dir _path =do
    setCurrentDirectory _path
    _cd <- getCurrentDirectory
    print _cd
    _file <- getDirectoryContents _cd
    print _file
Run Code Online (Sandbox Code Playgroud)

因此调用_dir"c:/ code/haskell"将列出所有文件+目录名称(非递归).我现在想要的是在谓词函数中调用它,例如:

[ x| x <- _dir  "c:/code/haskell" | x start with 'haskell_' ]  
Run Code Online (Sandbox Code Playgroud)

所以我可以在文件名上应用过滤器

directory file-io haskell

14
推荐指数
5
解决办法
2万
查看次数

'where'中的类型声明 - 发生了什么?

在阅读QuickCheck手册时,我遇到了以下示例:

prop_RevRev xs = reverse (reverse xs) == xs
  where types = xs::[Int]
Run Code Online (Sandbox Code Playgroud)

手册继续说:

属性必须具有单形类型."多态"属性(例如上面的属性)必须限制为用于测试的特定类型.通过在a中声明一个或多个参数的类型来方便

其中types =(x1 :: t1,x2 :: t2,...)

条款.请注意,类型不是关键字; 这只是一个本地声明,它提供了一个方便的地方来限制x1,x2等的类型.

我之前从未在Haskell中看过这样的技巧.这是我真正遇到的问题:

  1. 为什么类型声明的这种语法甚至存在?以下哪些不能对我做什么?

    prop_RevRev :: [Int] -> Bool
    prop_RevRev xs = reverse (reverse xs) == xs
    
    Run Code Online (Sandbox Code Playgroud)
  2. 这种用法是否where构成了类型声明的"特殊"语法?或者它是否一致和合乎逻辑(如果是这样,如何?)?

  3. 这是使用标准还是传统的Haskell?

haskell types where-clause

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

我可以定义多个静态块吗?

我可以定义多个静态块吗?

如果可能的话,我为什么要定义多个静态块呢?

java static block

14
推荐指数
4
解决办法
4347
查看次数

为什么`vector`实现有多个案例?

这是clojure的定义vector:

(defn vector
  "Creates a new vector containing the args."
  {:added "1.0"
   :static true}
  ([] [])
  ([a] [a])
  ([a b] [a b])
  ([a b c] [a b c])
  ([a b c d] [a b c d])
  ([a b c d & args]
     (. clojure.lang.LazilyPersistentVector (create (cons a (cons b (cons c (cons d args))))))))
Run Code Online (Sandbox Code Playgroud)

为什么会有这么多案件?或者,如果有这么多,为什么还有更多呢?

我的猜测是它在实现效率和概率之间达到了平衡,但我不太清楚这是如何更有效的.

language-implementation vector clojure

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

为什么monad变换器不能限制产生monad?

MonadTrans类中:

class MonadTrans t where
    -- | Lift a computation from the argument monad to the constructed monad.
    lift :: Monad m => m a -> t m a
Run Code Online (Sandbox Code Playgroud)

为什么不被t m限制为Monad?即,为什么不:

{-# LANGUAGE MultiParamTypeClasses #-}
class Monad (t m) => MonadTrans t m where
  lift :: Monad m => m a -> t m a
Run Code Online (Sandbox Code Playgroud)

如果答案是"因为那就是它的方式",那很好 - 这只会让n008感到困惑.

monads haskell typeclass monad-transformers

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

哪些编程语言功能非常适合开发实时编码框架?

我想建立一个"实时编码框架".

我应该解释一下"实时编码框架"的含义.我将通过将实时编码与传统编码进行比较来实现.

一般来说,在传统编程中,您编写代码,有时编译代码,然后启动可执行文件或在某种解释器中打开脚本.如果要修改应用程序,则必须重复此过程.实时编码框架使代码能够在应用程序运行时更新并按需重新加载.每次更改包含代码的文件或执行其他操作时,可能会发生此重新加载.然后,代码中的更改将在应用程序运行时反映出来.无需关闭程序并重新编译和重新启动它.

在这种情况下,应用程序是一个带窗口的应用程序,它具有更新/绘制循环,很可能使用OpenGL进行图形处理,音频库用于声音处理(SuperCollider?),理想情况下是网络库.

当然我有首选语言,但我不确定它们中的任何一种都适合这种架构.理想情况下,我会使用Python,Lua,Ruby或其他更高级别的语言.然而,一位朋友最近建议将Clojure作为一种可能性,所以我也在考虑它.

我不仅想知道哪种语言适合这种框架,而且通常,哪种语言特性可以使这样的框架成为可能.

ruby python lua clojure livecoding

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

在不使用"左连接"的情况下模拟左连接

我需要模拟左连接效果而不使用"左连接"键.

我有两个表,A和B,都有idname列.我想在两个表中选择所有dbid,其中A中的名称等于B中的名称.

我使用它来进行同步,所以在开始时B是空的(所以我将有一对来自A的id,其值为一,而来自B的id为null).后来我将有价值的夫妻 - 价值和价值 - 无效.

通常它会是:

SELECT A.id, B.id
FROM A left join B
ON A.name = B.name
Run Code Online (Sandbox Code Playgroud)

问题是我不能使用left join并想知道是否/如何做同样的事情.

sql

13
推荐指数
5
解决办法
2万
查看次数