鉴于Perl 5不符合BNF,我对如何思考这个问题感到茫然.有人可以提出一些建议让我以正确的方式考虑这个问题吗?
这是一个不适合我的功能,我想我需要摆脱fst.
flagHolidays :: [(C.Day,Availability)] -> Handler [(C.Day,Availability)]
flagHolidays dayPairs = do
let days = map fst dayPairs
yepNope = Prelude.map isHoliday days
availability = Prelude.map flagAvailability yepNope
return $ Prelude.zip days availability
Run Code Online (Sandbox Code Playgroud)
我能想到的唯一方法是进行非常难看的模式匹配(x,y):(xs,ys).删除是否fst有意义?如果是这样,那么对这个对列表进行模式匹配的最佳方法是什么?
我有一组五个函数,可以称为五种方法之一.我是这样用patern-matching表达的,
type Configure = ReaderT Config IO ()
data Step = PreVal
| PreProc
| Proc
| PostProc
| PostVal
foo :: Step -> Configure
foo PreVal = do some stuff
foo PreProc = do some stuff
Run Code Online (Sandbox Code Playgroud)
等等,bar并baz设置相似
我知道如何用来sequence调用一系列动作.鉴于[Step],我怎么能去打电话[foo,bar,baz].按顺序,同时也调用每个可能的步骤.
所以它应该这样做
foo PreVal
foo PreProc
...依此类推
bar Preval
bar PreProc
...等等
baz......
我正在写一个SQL解释器.我需要在编译时区分不正确的表达式和运行时错误.
我会给你一个应该是格式良好的例子,但可能在运行时失败.
SELECT $ [ColumnName "first_name" `AS` "name"] `FROM` TABLE "people.csv" `WHERE` (ColumnName "age" `Gte` LiteralInt 40)
Run Code Online (Sandbox Code Playgroud)
我想专注于表达:
(ColumnName "age" `Gte` LiteralInt 40)
Run Code Online (Sandbox Code Playgroud)
这应该通过类型检查器.但是,说"年龄"并不包含可以表达为a的东西LiteralInt.
所以我想要Gte产生类似的东西IO Bool(暂不考虑异常处理).
但我并不总是需要Gte制作一个IO Bool.如果我有这样的事情:
(LiteralInt 40 `Gte` LiteralInt 10)我只需要一个Bool.或类似的东西:
(LiteralInt 40 `Gte` LiteralBool True)需要在编译时失败.
所以,我一直在玩弄数据系列和GADT,并且已经落下了许多死胡同,如果我解释它们就会混淆这种情况.
我的问题是否有意义,如果是这样,我可以通过一个探索的途径来解决问题?
感谢Benjamin Hodgson,我已经开始实现一个类型安全的SQL-Interface,从这个 stackoverflow问题开始.
据我所知,我已经开始阅读单身纸.我发现看到工作代码有很多帮助,并努力查看提供的代码是否有效.但是,代码已有三年历史,需要进行一些更新.大!现在我开始学习一些东西.这是第一步,使用type-literal字符串删除提升类型的AChar.
来自原始代码 singletons-examples/DatabaseStar.hs
{-# OPTIONS_GHC -fwarn-incomplete-patterns #-}
{-# Language PolyKinds, DataKinds, TemplateHaskell, TypeFamilies,
GADTs, TypeOperators, RankNTypes, FlexibleContexts, UndecidableInstances,
FlexibleInstances, ScopedTypeVariables, MultiParamTypeClasses #-}
module DatabaseStar where
import Data.Singletons
import Data.Singletons.CustomStar
import Data.Singletons.TH
$(singletons [d|
-- A re-definition of Char as an algebraic data type.
-- This is necessary to allow for promotion and type-level Strings.
data AChar = CA | CB | CC | CD | CE | CF | CG …Run Code Online (Sandbox Code Playgroud) 我创建了描述二叉树的新类型
data BinTree a = Null | Num a (BinTree a) (BinTree a)
deriving (Show)
Run Code Online (Sandbox Code Playgroud)
并创建了以下功能:
treehandle :: BinTree a -> Bool
treehandle a = True
Run Code Online (Sandbox Code Playgroud)
检查至少输入值.
当我输入值Null时,程序输出结果成功,但我无法输入二叉树.我这样试试:
treehandle (5 (Null) (Null))
Run Code Online (Sandbox Code Playgroud)
但获得:
<interactive>:66:13:
No instance for (Num (BinTree a1 -> BinTree a2 -> BinTree a0))
(maybe you haven't applied enough arguments to a function?)
arising from the literal ‘5’
In the expression: 5
In the first argument of ‘treehandle’, namely ‘(5 (Null) (Null))’
In the expression: treehandle (5 (Null) …Run Code Online (Sandbox Code Playgroud) 我想为Vertex编写基本实现。
data Point a = Point a a
class XY c where
x :: c a -> a
y :: c a -> a
class XY c => Vertex c where
translate :: c a -> c a -> c a
scale :: a -> c a -> c a
rotate :: a -> c a -> c a
instance XY Point where
x (Point first second) = first
y (Point first second) = second
instance Vertex Point where
translate …Run Code Online (Sandbox Code Playgroud) 我编写了第一个计算素数的程序。但是它运行得很慢,我不知道为什么。我用Java编写了类似的代码,对于n = 10000,Java程序无需花费任何时间,而Haskell程序则需要2分钟。
import Data.List
main = do
print "HowManyPrimes? - OnlyInteger"
inputNumber <- getLine
let x = (read inputNumber :: Int)
print (firstNPrimes x)
-- prime - algorithm
primeNumber:: Int -> Bool
primeNumber 2 = True
primeNumber x = primNumberRec x (div x 2)
primNumberRec:: Int -> Int -> Bool
primNumberRec x y
|y == 0 = False
|y == 1 = True
|mod x y == 0 = False
|otherwise = primNumberRec x (y-1)
-- prime numbers till …Run Code Online (Sandbox Code Playgroud) 我有此功能,需要检查gdc数字的[1..n]和n是否正确== 1,然后进行一些计算。所以我被困住了,因为我找不到将n的初始值存储到变量的方法。
例如,如果我调用该函数与数字7其递归所以n变得6然后5等等所以我不能gdc正确; 例如1-7然后2 - 7然后3 -7。您知道如何存储nto a变量的值吗?
myproduct :: Integer->Integer
myproduct 0 = 1
myproduct n
|gcd n (n from first call) /= 1 = myproduct (n-1)
|otherwise = x
where
x = n * myproduct (n - 1)
Run Code Online (Sandbox Code Playgroud) 我创建了一个小函数,将整数列表映射到它们的平方根。代码本身很简单:
f x = map sqrt [1..x]
Run Code Online (Sandbox Code Playgroud)
使用默认类型推断,它可以成功加载,但该函数可以接受Floating类型类值,而我只是希望它接受Integers。所以我在它上面添加了一个类型注释。
f :: (Integral a, Floating b) => a -> [b]
f x = map sqrt [1..x]
Run Code Online (Sandbox Code Playgroud)
出乎我的意料,加载失败。在 GHCi 的 REPL 中抛出错误:
1.hs:48:7: error:
• Couldn't match type ‘a’ with ‘b’
‘a’ is a rigid type variable bound by
the type signature for:
f :: forall a b. (Integral a, Floating b) => a -> [b]
at 1.hs:47:1-41
‘b’ is a rigid type variable bound by
the type signature …Run Code Online (Sandbox Code Playgroud)