具有某种反射/内省规范的语言的巨大好处之一是可以从各种来源自动构建对象.
例如,在Java中,我可以使用相同的对象来持久化到db(使用Hibernate),序列化为XML(使用JAXB),以及序列化为JSON(json-lib).您可以在Ruby和Python中执行相同的操作,通常也遵循一些简单的Java属性或注释规则.
因此,我不需要很多"域转移对象".我可以专注于我正在工作的领域.
它似乎在像Haskell和Ocaml这样非常严格的FP中,这是不可能的.特别是Haskell.我唯一看到的是进行某种预处理或元编程(ocaml).只是接受你必须从底部向上进行所有转换吗?
换句话说,您必须做很多无聊的工作才能将haskell中的数据类型转换为JSON/XML/DB Row对象,然后再转换回数据对象.
例如,一个没有自由变量的引用透明函数:
g op x y = x `op` y
Run Code Online (Sandbox Code Playgroud)
现在是一个带有自由(从观点来看f
)变量的函数op
和x
:
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未在此函数中绑定,这使其"自由".现在我们知道函数中使用的变量是绑定的还是空闲的,我们可以将函数分为具有自由变量的函数和不具有以下函数的函数:
- 不包含自由变量的函数称为纯函数.
- 包含一个或多个自由变量的函数称为闭包.
那么"纯函数"的定义是什么?
我有两部分代码要执行.两者都是条件
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)
我收到语法错误.
我想要的是写一个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)
所以我可以在文件名上应用过滤器
在阅读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中看过这样的技巧.这是我真正遇到的问题:
为什么类型声明的这种语法甚至存在?以下哪些不能对我做什么?
prop_RevRev :: [Int] -> Bool
prop_RevRev xs = reverse (reverse xs) == xs
Run Code Online (Sandbox Code Playgroud)这种用法是否where
构成了类型声明的"特殊"语法?或者它是否一致和合乎逻辑(如果是这样,如何?)?
这是使用标准还是传统的Haskell?
这是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)
为什么会有这么多案件?或者,如果有这么多,为什么还有更多呢?
我的猜测是它在实现效率和概率之间达到了平衡,但我不太清楚这是如何更有效的.
在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感到困惑.
我想建立一个"实时编码框架".
我应该解释一下"实时编码框架"的含义.我将通过将实时编码与传统编码进行比较来实现.
一般来说,在传统编程中,您编写代码,有时编译代码,然后启动可执行文件或在某种解释器中打开脚本.如果要修改应用程序,则必须重复此过程.实时编码框架使代码能够在应用程序运行时更新并按需重新加载.每次更改包含代码的文件或执行其他操作时,可能会发生此重新加载.然后,代码中的更改将在应用程序运行时反映出来.无需关闭程序并重新编译和重新启动它.
在这种情况下,应用程序是一个带窗口的应用程序,它具有更新/绘制循环,很可能使用OpenGL进行图形处理,音频库用于声音处理(SuperCollider?),理想情况下是网络库.
当然我有首选语言,但我不确定它们中的任何一种都适合这种架构.理想情况下,我会使用Python,Lua,Ruby或其他更高级别的语言.然而,一位朋友最近建议将Clojure作为一种可能性,所以我也在考虑它.
我不仅想知道哪种语言适合这种框架,而且通常,哪种语言特性可以使这样的框架成为可能.
我需要模拟左连接效果而不使用"左连接"键.
我有两个表,A和B,都有id
和name
列.我想在两个表中选择所有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
并想知道是否/如何做同样的事情.