在Haskell中,所有功能都是最初的咖喱,对吗?
那么,让我们来看一下这个max函数吧,我会写下我对它是如何工作的理解.
当我写这样的东西时:
max 4 5
Run Code Online (Sandbox Code Playgroud)
会发生的是创建一个内部值为4的新函数,然后接收一个值,因此将此函数应用于5并返回正确的值?
我是以某种方式说错了还是这是正确的?
他有一个例子,tupleReplicate它返回一个带值的函数并复制它:
tupleReplicate :: Int -> Q Exp
tupleReplicate n = do id <- newName "x"
return $ LamE (VarP id)
(TupE $ replicate n $ VarE id)
Run Code Online (Sandbox Code Playgroud)
那么VarE id返回一个表达式,然后可以使用replicate?我的问题是,如果id是列表,这将如何工作?我想做的事情如下:
let vals = mkName "vals"
LamE (ListP vals) (map reverse $ ListE vals)
Run Code Online (Sandbox Code Playgroud)
除非因为ListE退货Exp而不起作用[Exp].
更一般地说,我想在TemplateHaskell中编写一个获取列表并将函数应用于它的函数.
这里也有一些示例代码在这里,我试图写这样一个函数
makeModel (id_ : name_ : []) = Person (fromSql id_) (fromSql name_)
Run Code Online (Sandbox Code Playgroud) 为什么这个函数有类型:
deleteAllMp4sExcluding :: [Char] -> IO (IO ())
而不是deleteAllMp4sExcluding :: [Char] -> IO ()
另外,我怎么能重写这个以便它有一个更简单的定义?
这是函数定义:
import System.FilePath.Glob
import qualified Data.String.Utils as S
deleteAllMp4sExcluding videoFileName =
let dirGlob = globDir [compile "*"] "."
f = filter (\s -> S.endswith ".mp4" s && (/=) videoFileName s) . head . fst
lst = f <$> dirGlob
in mapM_ removeFile <$> lst
Run Code Online (Sandbox Code Playgroud) 维基百科说:
Monadic 函数(即使用 monad 中的值作为参数或返回值的函数)。
我的理解是函数接受或返回单子是单子函数,但当我遇到这个博客时,它似乎有更严格的定义
作者说:
一元函数是产生一元值的函数。(请注意,我们没有提及其输入类型)
和
形式的函数
f :: a -> m b,其中a是 monad 内部值的类型。(称这些为经典的一元函数)形式的函数
f :: anything -> m b,其中函数的输入实际上并不重要。(将这些称为松散一元函数)
看起来定义相当严格和正式,但我找不到任何关于经典一元函数、松散一元函数的内容。
那么一元函数到底是什么?
我有一个函数,在给定数据类型的情况下输出类似booleanlike的属性.此函数通过模式匹配在数据类型的第一个构造函数上计算属性,所以类似于
data C = C1 | C2 | .. | Cn
f :: C -> Bool
f (C1 _ _ ... _) = True
f (C2 _ _ ... _) = True
f (C3 _ _ ... _) = False
.
.
.
f (Cn _ _ ..._) = False
Run Code Online (Sandbox Code Playgroud)
是否有更紧凑的方式来执行模式匹配,还是有另一种(也更紧凑)的方式来进行我的财产检查?我不想将属性添加到数据类型定义中,因为它可以相对容易地计算.
我是Haskell的新手.这是一些简单的代码:
module Src
( -- The 'Answer' type isn't exported
Shape(Circle), -- i.e 'Rectangle' data constructor isn't exported
Point(..),
area,
nudge
) where
data Answer = Yes | No deriving (Show)
data Point = Point Float Float deriving (Show)
data Shape = Circle Point Float | Rectangle Point Point
deriving (Show)
area :: Shape -> Float
area (Circle _ r) = pi * r ^ 2
area (Rectangle (Point x1 y1) (Point x2 y2)) = (abs $ x2 - x1) …Run Code Online (Sandbox Code Playgroud) 我需要学习使用Reader monad.(还有作家和国家).
我所做的游戏竞赛总是包含在整个游戏中有效的全局参数.还有一堆只在一个转弯期间有效的参数.
我结束了所有最新的比赛,有很多很多功能,几乎都有Game和Turn作为输入参数.
在阅读了关于读者monad之后,我正在考虑:
data Game = Game AllNeeded StrategicPositions AndGameRelatedStuffs
data Turn = Turn PlayersPositions AndTurnDependentStuffs
Run Code Online (Sandbox Code Playgroud)
当我收到转弯依赖数据时,每个循环,我计划有一个变量Reader Game Turn:
turnReader = Reader currentGame currentTurn
let actionToPerform = play turnReader
Run Code Online (Sandbox Code Playgroud)
你认为这是Reader monad的应用程序的好例子吗?您是否认为我可以/应该蒙上眼睛并学会在此上下文中使用Reader monad?还是有更合适的monad,就像State一样?
令我惊讶的是,我发现在TCanvas上重复渲染文本在某种程度上是"附加的".我意识到设置Canvas.Brush.Style:=bsClear是问题的原因,但我确实需要透明地重复呈现文本(即在OnPaint事件中).执行此操作后,文本看起来不太好.
我怎么能避免这种情况?
这是一些示例代码; 如果你在被调用的TButton上点击几下,就可以看到效果btn1.
procedure TForm1.btn1Click(Sender: TObject);
begin
Form1.Canvas.Brush.Style:=bsClear; //if you omit this, everything is OK.
Form1.Canvas.Font.Color:=clRed;
Form1.Canvas.Font.Name:='Times new Roman';
Form1.Canvas.Font.Style:=[fsBold];
Form1.Canvas.Font.Size:=12;
Form1.Canvas.TextOut(50,50,'www.stackoverflow.com');
end;
Run Code Online (Sandbox Code Playgroud) 如何将数据添加到我的数据库?
我的表格:
from django import forms
class DinnerForm(forms.Form):
name = forms.CharField(max_length=100)
text = forms.CharField(max_length=255)
Run Code Online (Sandbox Code Playgroud)
和型号:
class Dinner(models.Model):
name = models.CharField(max_length=100)
text = models.CharField(max_length=255)
Run Code Online (Sandbox Code Playgroud)
我的看法:
def add_dinner(request):
if request.method == 'POST':
form = DinnerForm(request.POST)
if form.is_valid():
name = form.cleaned_data['name']
text = form.cleaned_data['text']
Run Code Online (Sandbox Code Playgroud)
如何将数据保存到数据库?
我是Haskell的新手.鉴于Haskell的整个前提是函数将始终返回相同的值,我希望有一些方法可以在编译时计算常量的fibonacci值,就像我可以在C++中使用模板元编程一样,但我可以看不出怎么做.有办法吗?