我对Python有一点经验(足够我可以做的事情,如果/ else/elif和一些随机数生成),但我总是对Lisp语言有一种奇怪的迷恋.我下载了一些方案源代码来查看语法,但这对我来说非常愚蠢.
对于像我这样只有一点编程经验的程序员,给出一些好书,网站和一些时间,学习Common Lisp或Scheme会特别困难吗?哪两个会更容易?就易学性而言,它们与Python和C相比如何?
谢谢
考虑以下功能:
f :: a -> Int
f x = (1 :: Int)
Run Code Online (Sandbox Code Playgroud)
我们可能会说类型f是a -> Int,f因此属于"更高级"类型.
以下哪一项是最准确的思考方式f?
其实也有一个单一 f型的a -> Int.但是,可以使用,作为f :: Int -> Int作为f :: Double -> Int,等等.
从字面上讲,类型f不是a -> Int.实际上,这只是一种简短的说法,即有一类函数f的类型是具体的(即,有一个f :: Int -> Int,一个f :: Double -> Double等等;此外,这些函数中的每一个都是彼此不同的).
同样,我们可以考虑以下类型声明:
data Maybe a = Just a | Nothing
Run Code Online (Sandbox Code Playgroud)
并且问两种观点中的哪一种更正确:
没有 …
看起来我非常清楚地了解MonoidHaskell中的内容,但上次我听说过一个叫做免费幺半群的东西.
什么是自由幺半群?它与幺半群有什么关系?
你能在Haskell中提供一个例子吗?
我不明白为什么下面的程序无法编译。
module Main where
import Prelude
import Effect (Effect)
import Effect.Console (log)
import Data.Generic.Rep (class Generic)
import Foreign.Generic (defaultOptions, genericEncodeJSON)
main :: Effect Unit
main = do
log "Hello sailor!"
newtype Foo = Foo {
x :: Int
, y :: Int
, z :: Array Bar
}
type Bar = {
a :: String
, b :: String
}
derive instance repGenericFoo:: Generic Foo _
fooToJSON :: Foo -> String
fooToJSON = genericEncodeJSON $ defaultOptions { unwrapSingleConstructors = true …Run Code Online (Sandbox Code Playgroud) 我听说这个结构被宽泛地描述为"数据中表示的遍历,应用于某些结构,而不需要应用程序"
它可以定义为:
data X a b r =
| Done r
| Step a (X a b (b -> r))
Run Code Online (Sandbox Code Playgroud)
单词描述如下:
X a b r描述了结构的形状aa机会生产出类型的东西ba,r.因此,列表的"遍历" [a]具有类型X a b [b],因为如果您可以将每个a列表转换为a,b那么您将得到一个[b].
我的问题是:这个叫做什么?是否有关于它的更多信息的参考?
用法示例:
instance Functor (X a b) where
fmap f (Done r) = f r
fmap f (Step a next) = Step a (fmap (f .) …Run Code Online (Sandbox Code Playgroud) 如何make-array在SBCL工作?在C++中是否有一些等价物new和delete运算符,或者它是否是其他东西,也许是汇编程度?
我偷看了源头,却什么都不懂.
我一直致力于普通lisp的jarvis march实现.jarvis march算法采用一堆点并返回该点云的凸包.我将每个点表示为这样的结构:
(defstruct point x y)
Run Code Online (Sandbox Code Playgroud)
然后我继续定义一个测试集,但是,由于初始化结构的符号相当长(make-point :x 0 :y 1),我决定创建一个自动为我做的函数:
(defun make-points (list)
(map
'list
(lambda (e) (make-point :x (first e) :y (second e)))
list))
Run Code Online (Sandbox Code Playgroud)
可悲的是,它不起作用.
(print (first (make-points '('(2 3))))) ;prints out '#S(POINT :X QUOTE :Y (2 3))' => wrong
(print (make-point :x 2 :y 3)) ;prints out '#S(POINT :X 2 :Y 3)' => correct
Run Code Online (Sandbox Code Playgroud)
它将完整列表(2 3)绑定到所有事物的y值,并且它不为x值赋值.为什么会这样做以及如何解决它.
在此先感谢,我对lisp相当新鲜(正如你可能从这个问题中猜到的那样),如果有人可以帮助我,我将非常感激.如果有人知道任何捷径或对我的工作方法有任何好的论据也会很好,虽然在评论中告诉我他们可能会更好,因为他们不会直接回答这个问题.
common-lisp ×3
haskell ×3
lisp ×2
compilation ×1
mapping ×1
monoids ×1
purescript ×1
scheme ×1
types ×1