我对Literal关键字有点困惑,为什么在F#中有必要.
阅读文档,听起来我[<Literal>]用它来定义一个常量,但是我有点困惑这个常量如何与F#中的所有其他常量不同.
可以使用Literal属性标记要作为常量的值.此属性具有将值编译为常量的效果.
当我想到一个常数时,我会想到一些不可改变的东西......
let x = "a" + "b" //this is a immutable value, its value is constant
[<Literal>]
let y = "a" + "b" //this is also a immutable value, but why is this a special constant?
Run Code Online (Sandbox Code Playgroud)
是因为"普通"F#值被懒惰地评估而且[<Literal>]不会被懒惰地评估.?他们的意思是'编译为常数'..?或者还有别的东西吗?
假设我想创建一个函数,它将lambda函数(Callable)作为参数,其中lambda函数将向量作为输入(定义为numpy数组或numpy矩阵)并返回一个新向量.如何使用numpy类型声明Callable的类型签名?
我最初的尝试看起来像这样:
def some_func(calc_new_vector: Callable[[np.array], np.array], ...other-params...) -> SomeType:
...do stuff...
...return...
Run Code Online (Sandbox Code Playgroud)
但是,这会在运行解释器时导致错误:
TypeError: Callable[[arg, ...], result]: each arg must be a type. Got <built-in function array>.
Run Code Online (Sandbox Code Playgroud) 许多python IDE都提供代码完成(代码洞察),PyCharm是其中一个IDE.但是,在我看来,提供的代码完成非常有限.让我举个例子说清楚:
import numpy as np
m = np.random.random((3,5))
m.
Run Code Online (Sandbox Code Playgroud)
在'm'之后击中CTRL空间.不会给我任何代码完成, - 无论我多么难以点击它;)..我想这是因为IDE必须进行类型推断以了解变量'm'的类型,并且这不是'在动态编程语言领域中是微不足道的.
现在,PyCharm带有一个名为"收集代码洞察的运行时类型信息"的设置,这听起来确实很有希望.但是,它似乎没有解决上面提到的问题..我仍然无法在变量'm'上获得代码完成.
到目前为止,我只找到了一种在PyCharm中获取变量代码完成的方法:
import numpy as np
m = np.random.random((3,5))
''':type : np.matrix'''
m.
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我可以在'm.'之后按CTRL空格时获得代码完成,这是因为我通过使用docstring指定变量的类型来帮助IDE.但是,我对这种获取代码完成的方式不满意,因为它为所有这些文档字符串添加了不必要的冗长(更不用说所有额外的键盘输入了)...
现在,如果我们在linux-terminal中启动IPython并输入第一段代码,我们将能够一直获得代码完成,即使是变量'm'.(通过按TAB而不是CTRL空格来实现IPython中的代码完成)
我对IPython没有多少经验,但我相信我听说过IPython不断在循环中执行代码或类似的东西......
我认为应该可以使用IPython来实现PyCharm编辑器中所有变量的REAL代码完成....
有没有办法设置PyCharm使用IPython进行代码完成?
请注意,我不满意将代码发送到终端窗口/控制台,或类似的东西,我想在PyCharm的编辑器中完成代码...
我在Pycharm Ubuntu中看过像这样的问题添加ipython作为解释器,但它似乎是在控制台中使用IPython,而不是在编辑器中......在IDE中也有很多关于代码完成的问题,但他们似乎都有与PyCharm相同的令人不满意的代码完成程度......
是否可以查看字符串是否与表名相同?
例如:我知道存在一个名为'os'的表,我有一个字符串"os".那么有办法做到这一点:
x="os"
if type(x)=="table" then
print("hurra, the string is a table")
end
Run Code Online (Sandbox Code Playgroud)
当然这个例子不会像我想要的那样工作,因为
type(x)
Run Code Online (Sandbox Code Playgroud)
只会返回"字符串".
我想要这样做的原因只是因为我想列出所有现有的Lua表,所以我做了这段代码:
alphabetStart=97
alphabetEnd=122
function findAllTables(currString, length)
if type(allTables)=="nil" then
allTables={}
end
if type(currString)=="table" then
allTables[#allTables+1]=currString
end
if #currString < length then
for i=alphabetStart, alphabetEnd do
findAllTables(currString..string.char(i), length)
end
end
end
findAllTables("", 2)
for i in pairs(allTables) do
print(i)
end
Run Code Online (Sandbox Code Playgroud)
如果有一个更简单的方法来列出所有现有表格,我不会感到惊讶,我只是为了学习Lua的过程中的乐趣.
问题很简单,我希望对一些旅行费用进行一些计算,包括DKK和JPY的费用.因此,我找到了一种模拟货币的好方法,因此我能够来回转换:
[<Measure>] type JPY
[<Measure>] type DKK
type CurrencyRate<[<Measure>]'u, [<Measure>]'v> =
{ Rate: decimal<'u/'v>; Date: System.DateTime}
let sep10 = System.DateTime(2015,9,10)
let DKK_TO_JPY : CurrencyRate<JPY,DKK> =
{ Rate = (1773.65m<JPY> / 100m<DKK>); Date = sep10}
let JPY_TO_DKK : CurrencyRate<DKK,JPY> =
{ Rate = (5.36m<DKK> / 100.0m<JPY>); Date=sep10 }
Run Code Online (Sandbox Code Playgroud)
我继续将费用计算为记录类型
type Expense<[<Measure>] 'a> = {
name: string
quantity: int
amount: decimal<'a>
}
Run Code Online (Sandbox Code Playgroud)
在这里我有一个示例费用清单:
let travel_expenses = [
{ name = "flight tickets"; quantity = 1; amount = 5000m<DKK> }
{ name = …Run Code Online (Sandbox Code Playgroud) 我目前正在学习模型检查(模态逻辑,LTL,CTL,SAL模型检查器等).在我的业余时间,我正在学习Idris,这是一种支持依赖类型的强类型函数式编程语言.由于我正在研究模型检查和Idris,我开始对Idris如何与形式化方法和模型检查相关联感到好奇.
在了解模型检查时,感觉大多数示例都是关于验证以命令方式编写的系统或硬件组件.所以我对强类型函数式编程语言中的模型检查的相关性感到困惑,特别是在依赖类型的语言中,例如Idris,在我看来,类型检查器在验证正确性方面已经做了出色的工作. 然而,我的直觉告诉我,模型检查可能与不给予任何终止承诺的部分功能相关.
使用强大且依赖类型的编程语言(例如Idris)时,模型检查是否相关?
FPGA在业界得到广泛应用,通过在FPGA而不是软件上实现程序来获得更好的性能.
这些公司如何有效地将FPGA集成到他们的系统中?
我对FPGA的经验非常有限,并且只使用USB和串行端口连接它们,我想这不是最好地利用FPGA实现的方法.
那么这些公司做了什么呢?例如,他们是否使用了一些可以插入计算机系统PCI插槽的特殊FPGA,或者他们是否可以购买一些带有集成FPGA的特殊SoC,这些SoC很容易被程序员覆盖?
我在远离硬件的高级语言编程方面经验最丰富,所以如果问题听起来很愚蠢我很抱歉 - 我对下层没有太多的知识和经验:).但是我曾经有过使用FPGA的课程,这是一次非常开放的经历.所以现在我梦想拥有一个计算机系统,我可以用高级语言编写部分代码,然后与集成的FPGA进行一些通信,我已经上传了一些合成的VHDL.
也许甚至可以编写由高级代码和一些VHDL组成的程序,这些程序在程序启动时自动合成并上传到FPGA板......这太棒了!
所以我最近在F#中使用Async库获得了一点乐趣,特别是Async.Parallel非常惊讶,它基本上采用了一系列异步任务并在一个异步任务下统一它们.
但是,现在我很好奇如何在多台计算机之间分配计算任务,例如我办公桌上的两台笔记本电脑.
是否有可能序列化这些异步任务并将它们发送到另一台计算机,然后执行该任务并将结果发回?
或者我可能需要序列化数据本身并将其发送到另一台计算机,我在其上运行一些执行计算并发送结果的代码?
或者可能还有另一种简单的方法吗?
使用.Net在F#中进行分布式计算的一般方法是什么?(推荐的设计模式,工具,库等)
我的最终目标是将一个大型计算任务分成更小的部分并在多台机器上运行它们.优选地,以简单的非企业 - 过度复杂的方式.
我正在尝试使用FSharp.Data(标准typeprovider库)创建一个dotnet-core F#项目作为linux下的依赖项.
我使用该命令创建了一个项目dotnet new -l F#并添加FSharp.Data为依赖项.
{
"version": "1.0.0-*",
"buildOptions": {
"emitEntryPoint": true,
"compilerName": "fsc",
"compile": {
"includeFiles": [
"Program.fs"
]
}
},
"dependencies": {
"Microsoft.FSharp.Core.netcore": "1.0.0-alpha-160316",
"FSharp.Data": {"version": "2.3.1"},
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.0.0-rc2-3002702"
}
},
"tools": {
"dotnet-compile-fsc": {
"version": "1.0.0-*",
"imports": [
"dnxcore50",
"portable-net45+win81",
"netstandard1.3"
]
}
},
"frameworks": {
"netstandard1.5": {
"imports": [
"portable-net45+win8",
"dnxcore50"
]
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试构建项目时(通过执行dotnet restore后跟dotnet build),我得到一个错误,我认为可以归结为Could not load file or …
在我学习Elixir的过程中,我正在和Dialyzer一起玩我的功能.在这方面,我注意到Dialyzer似乎没有检查匿名函数的类型.
在下面的例子中,我传递一个匿名函数,它将两个数字相加并返回一个数字(t::number -> number)到all?函数中.因此,我没有按照all?规范中的承诺返回布尔值(t::any -> boolean).
defmodule Exercises do
@spec all?([t::any], (t::any -> boolean)) :: boolean
def all?([], _), do: true
def all?([h|t], con) do
if con.(h) do
all?(t,con)
else
false
end
end
@spec funski() :: boolean
def funski() do
all?([1,1,2], &(&1 + 1))
end
end
Run Code Online (Sandbox Code Playgroud)
Dialyzer似乎没有报告此代码的任何错误或警告,如果Dialyzer无法检查这种错误或者我做错了什么,我很好奇.