class IndexSelect k (m :: k -> (* -> *) -> *) | m -> k where
type Restriction m (p :: k) :: Constraint
indexSelect :: Restriction m p => Sing (p :: k) -> Proxy m -> LocalDb f -> f (TableEntity (m p)) 我是Haskell语言的新手。在我刚开始工作的公司的代码库中,我在破译一些代码中的类定义时遇到了麻烦。这是在做什么?
我现在正在尝试学习Scala,在Haskell方面有一点经验。有一点我觉得很奇怪,那就是Scala中的所有函数参数都必须用一个类型来注释--这是Haskell不需要的。为什么会这样呢?为了将其作为一个更具体的例子,可以这样写一个add函数:
def add(x:Double, y:Double) = x + y
但是,这只适用于双倍(嗯,由于隐式类型转换,ints也能工作)。但是,如果您想要定义自己的类型,定义自己的+操作符,该怎么办?您将如何编写用于定义+运算符的任何类型的add函数?
class (Eq e, GenExpr e, MonadRandom m) => GenProg m e | e -> m where
非常的,我无法理解这个GenProg m_e_e e_e -> m
我想GenProg是一个构造函数。
这是否意味着:其模式与GenProg m e或e -> m匹配的模式,其实例可以定义?
顺便问一下,haskell的所有语法都在哪里?
我是Haskell的新手,我很难准确地理解需要哪种类型的注释或哪种类型的签名才能让它工作。这个test函数本身是没有用的,但是如果我能理解如何让它工作,我想它会帮助我更好地理解haskell类型。
test 0 = -1
test n = test (floor (n / 10))
这个问题似乎是相关的:
但是我不知道如何让我的例子起作用。下面是我在运行test 0时看到的错误:
<interactive>:470:1:
Could not deduce (Integral a10) arising from a use of ‘test’
from the context (Nu
我是Haskell的新手,正在尝试创建一个带有实例的类。
我有下面的代码,我试着说: 1)分支可以在它的第一个位置包含任何类型,2)创建一个类线性,它接受线性的东西并返回一个数字3)使分支成为线性的实例,如果分支持有的第一个东西是Num类的一部分。
data Branch a = Branch a Integer deriving (Show, Eq)
class Linear l where
length :: (Num a) => l -> a
instance (Num a) => Linear (Branch a) where
length (Br
可能重复:
在下面(从Data.HList.HListPrelude )中,我如何解释| l l' -> l''部分?
class HAppend l l' l'' | l l' -> l''
where
hAppend :: l -> l' -> l''
它是标准Haskell (即Haskell 2010)的一部分,还是扩展的一部分?
在面向对象的语言(例如Java和Python)中,我们可以从类中生成对象/实例。在Haskell中,我们可以从类型类中创建实例,例如:
data ShirtSize = S | M | L -- Here ShirtSize is a enum data-type
class MyEq a where
(==) :: a -> a -> Bool
instance MyEq ShirtSize where -- Here ShirtSize is an instance of the MyEq type-class
S == S = True
M ==
给定类型为f的值:: Applicative f => f (a -> b -> c),将参数映射到内部函数的最佳方法是什么。
到目前为止,我发现了以下几点:
(\x -> x a b) <$> f
(flip ($ a) b) <$> f
($ b) <$> ($ a) <$> f
我想我的问题是为什么Haskell没有:: a -> b -> (a -> b -> c) -> c函数。或者是真的?
我正在尝试用Haskell编写一个机器学习库,以提高我的Haskell技能。我想到了一个包含一个类的通用设计,就像这样:
class Classifier classifier where
train :: X -> y -> trainingData
classify :: trainingData -> x -> y
例如,在给定一组示例X及其真实标签y的情况下,train返回在分类函数中使用的trainingData。
因此,如果我想实现KNN,我会这样做:
data KNN = KNN Int (Int -> Int -> Flo
在Haskell类型类中,可以引入“接口”,其中有一些“免费”类型参数,类似于"for all a:实例支持这组函数“。如果实例化这种类型类,就不能缩小这个a类型,否则就会出现关于刚性类型a的错误(比如"for all,但现在变得更窄了,这违背了原来的类型承诺“)。好的,我在我的IEnumerable类型(类)中实现了F#接口:
interface System.Collections.Generic.IEnumerable<byte> with
member __.GetEnumerator () = (__.GetBytes ()).Ge
我正在学习函数式语言的范例。所以我读过,虽然子类型多态性在OO语言中是典型的,但是参数多态性对于功能语言来说是典型的。
但我不知道功能语言中是否存在亚型多态性。我最熟悉的函数式语言是Haskell,我知道在Haskell中有很多类型的语言。
我一直认为类型类型有点类似于接口,而接口是子类型多态性。例如在这里:
data Foo a = Bar a | Baz String
deriving instance Eq a => Eq (Foo a)
Eq是定义(==)运算符的类型类型。这基本上就像一个Foo类实现了一个Eq接口。
所以我要问的是:这是否被认为是子类型(或子类型多态性)?
是否可以从终端或ghci获取Haskell文档?
在Ruby中,我通常这样做
ri thefunc
在Perl中,我通常这样做。
perldoc -f thefunc
或者我可以用Python语言获取交互式help。
如何在Haskell中做这样的事情?例如,如果我想在终端上获取有关[]或:的文档?
更新
我找到了,但我不确定:i是否是答案:-/或者它是?
*Main> :i []
data [] a = [] | a : [a] -- Defined in GHC.Types
instance (Eq a) => Eq [a] -- Defined in GHC.Base
即使没有扩展ExistentialQuantification,Haskell也通过类型同构为任何类型的C支持一些存在类型,
(forall a. C a => (a -> b)) ~ ((exists a. C a => a) -> b)
因此,函数f :: C a => a -> b需要一个类型为exists a. C a的参数x。但是Haskell不允许模式匹配x与某些类型的C (由野生匹配_完成,因为类型类通常是无限的)。
这很奇怪,因为存在型是广义和类型。Haskell使用data关键字支持有限和类型,并允许它们进行模式匹配。在C++、Java
我在Haskell中有以下函数
agreeLen :: (Eq a) => [a] -> [a] -> Int
agreeLen x y = length $ takeWhile (\(a,b) -> a == b) (zip x y)
我正在努力学习如何编写“惯用的”Haskell,它似乎更喜欢使用.和$,而不是括号,并且在可能的情况下更喜欢无指针的代码。我似乎不能摆脱明确提到x和y。有什么想法吗?
我想我也会遇到同样的问题,去指向包含两个参数的任何函数。
顺便说一句,这只是为了写出好的代码;而不是一些“不惜一切代价让它变得无关紧要”的作业练习。
谢谢。
(添加评
Haskell或特定的编译器是否有类似于类型级别的lambdas (如果这是一个术语的话)?
更详细地说,假设我有一个参数化的类型Foo a b,并且希望Foo _ b成为一个实例。有没有什么机制可以让我做一些类似于
instance Functor (\a -> Foo a b) where
...
我试图在Haskell做这样的定制结构:
data Interval = Interval Float Float
instance Interval Float Float where
(Interval a b) + (Interval c d) = Interval (a + c) (b + d)
(Interval a b) - (Interval c d) = Interval (a - c) (b - d)
但是,每次错误都会发生,比如:
“+”不是类“间隔”的可见方法。
那我该怎么做呢?
我想在一个应用程序中使用Haskell自定义操作符,该应用程序涉及在图像上安排文本和对象。例如,我将有一个执行垂直组合的操作符:将一个元素放在另一个元素之上。我们叫它吧。
让我们声明一个数据类型元素来表示可视对象。一种可视元素可能是字符串中指定的文本。在视觉上,这将创建一些默认字体和大小的单词。另一种可视元素可能是JPEG文件。所以我们有
type Filename = String
data Element = EString String
| EJpeg Filename
| EVerticalComposition Element E
我是Haskell的新手,所以请耐心等待。
假设我有这样一个类
class Indexable i where
at :: i a p -> p -> a
现在假设我想要实现这个数据类型的类型类:
data Test a p = Test [a]
我尝试的是:
instance Indexable Test where
at (Test l) p = l `genericIndex` p
但是它没有编译,因为p需要是一个整数,然而据我所知,不可能将类型签名添加到实例中。我尝试使用InstanceSigs,但失败了。
有什么想法吗?
我刚开始学习Haskell,对我来说,奇怪的是带有多个参数的函数类型的语法。
考虑一个简单的例子:
(+) :: Num a => a -> a -> a
为什么我们这里需要所有的箭?写像Num Num Num -> Num这样的东西不是更有意义吗?
引擎盖下的原因是什么?我寻找这个问题,但找不到任何有用的东西。
我正在尝试在Haskell中实现四阶Runge-Kutta,但我发现很难使用Haskell类型的系统来完成这项任务。有人能帮帮忙吗?我希望在下面的代码中将'State‘和'DState’类型更改为类型类:
data State = State Double deriving (Show)
data DState = DState Double deriving (Show)
update :: State -> DState -> State
update (State x) (DState y) = State (x+y)
add :: DState ->
我学习Haskell。Haskell中operator这个词的定义是什么?我找不到明确的定义。
我想是这样的(我自己的理解):
运算符是一个具有名称的函数,它只包含ascSymbol符号,而不是以:符号开头,并且只有两个参数。
来自Haskell 2010年的ascSymbol组包含:
#$%*+/<=>?@\ˆ|-˜:
但我不确定我是对的..。例如,在我看来,这就是运算符。
(!#$%&*+./<=>?@\^|-~:) :: Int -> Int -> Int
a !#$%&*+./<=>?@\^|-~: b =
我想要定义一个函数,它在某种类型构造函数(例如, )后面采用任意大小的值的值。
foo :: HList '[t a, t b, t c, ...] -> Bar
-- For example:
foo :: HList '[Maybe a, Maybe b, Maybe c, ...] -> Bar
在Haskell有什么办法吗?谢谢!