小编Bab*_*ham的帖子

Haskell - 结合数据类型?

我是Haskell的新手,我已经四处寻找下面的答案,但没有运气.

为什么这段代码不能编译?

newtype Name = Name String deriving (Show, Read)
newtype Age = Age Int deriving (Show, Read)
newtype Height = Height Int deriving (Show, Read)

data User = Person Name Age Height deriving (Show, Read)

data Characteristics a b c = Characteristics a b c

exampleFunction :: Characteristics a b c -> User
exampleFunction (Characteristics a b c) = (Person (Name a) (Age b) (Height c))
Run Code Online (Sandbox Code Playgroud)

错误:

"Couldn't match expected type ‘String’ with actual type ‘a’,‘a’ is a rigid …
Run Code Online (Sandbox Code Playgroud)

haskell types

1
推荐指数
1
解决办法
631
查看次数

lambda函数中的冒号?

我不理解冒号在以下lambda表达式中的作用:

myFunction :: [Int] -> [Int]
myFunction li = foldr (\x acc -> if x < 10 then x : acc else acc) [last li] li
Run Code Online (Sandbox Code Playgroud)

我习惯于看到冒号进行递归操作,但看起来这个冒号实际上是在说当前累加器列表的前置,是吗?

lambda haskell

1
推荐指数
1
解决办法
169
查看次数

对自定义数据类型执行操作?

我有以下数据类型:

data Users = Height Int | Age Int 
Run Code Online (Sandbox Code Playgroud)

然后我有一个年龄列表:

myList = [Age 44, Age 54, Age 21, Age 34, Age 22]
Run Code Online (Sandbox Code Playgroud)

我想申请这个功能:

myFunction :: [Users] -> [Users]
myFunction li = [x + 1 | x <- li]
Run Code Online (Sandbox Code Playgroud)

但是,这会导致以下错误:

"No instance for (Num Users) arising from a use of ‘+’"
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?我是否需要将'Age'与每个值分开?

haskell types

1
推荐指数
1
解决办法
220
查看次数

定制数据类型的目的?

这是一个简单的问题,但我仍然不确定.在Haskell中使用自定义类型的主要好处是什么,例如:

data Users a = User a a a 
data Towns a = TownA Int | TownB String | Nill
Run Code Online (Sandbox Code Playgroud)

这些自定义类型的主要用途是作为命令式语言中的对象吗?如

template<typename U>
class User 
{
  U a1;
  U a2;
  U a3;
};

int main()
{
  User<std::string> UserObj; UserObj.a1="a1"; //etc
}
Run Code Online (Sandbox Code Playgroud)

有没有人有简短而一般的解释?


NB我理解二进制类型的有用性,比如Maybe,我的问题更多的是关于自定义类型的使用.

haskell types

1
推荐指数
1
解决办法
148
查看次数

运算符重载的实际应用?

我试图更多地了解运算符重载的实际用法,以便我可以在我的代码中有效地使用它们.

你能描述一下重载通常有用的一般场景吗?也许提供一些简短的例子?

到目前为止,我知道以下内容:

1)使用STL算法进行重载是一个常见的例子:

class Example
{
 public:
   int operator()(int i)
   {
      return i+10;
   }
};

int main()
{
   std::vector<int> V{1,2,3,4,5};
   std::transform(V.begin(), V.end(), V.begin(), Example());
}
Run Code Online (Sandbox Code Playgroud)

虽然我认为现在这与lambda功能略有不同.

2)操纵对象成员:

class Example
{
 public:
   int some_variable {0};
   Example() {};
   Example(int x) : some_variable{x} {};

   Example operator+(Example &EO)
   {
      Example EO3;
      EO3.some_variable = some_variable + EO.some_variable;
      return EO3;
   }
};

int main()
{
  Example EO1(100);
  Example EO2(200);
  Example EO3 {EO1 + EO2};
}
Run Code Online (Sandbox Code Playgroud)

c++ operator-overloading

1
推荐指数
1
解决办法
957
查看次数

通用嵌套monad操作?

我已经获得了以下类接口:

class Misty m where
  banana :: (a -> m b) -> m a -> m b
  unicorn :: a -> m a
Run Code Online (Sandbox Code Playgroud)

现在我需要修改它以启用:

jellybean :: (Misty m) => m (m a) -> m a
Run Code Online (Sandbox Code Playgroud)

我相信问题是推动我添加一个Misty带有多个参数的子类:

class Misty m => VeryMisty m a where
  ... banana' (Just (Just v)) = banana --? 
Run Code Online (Sandbox Code Playgroud)

我不确定如何创建一个函数Misty来操作这个嵌套的monad?

我也不确定我的方法是否正确和/或最简单?

monads haskell

1
推荐指数
1
解决办法
52
查看次数

Haskell - 类型转换?

我正在尝试将列表"profile1"中的数据转换为名为"DataSubject"的自定义类型.

我将此传递给函数'makeDS'以尝试此转换 - 但是以下操作不起作用:

type Name = String 
type Age = Int 
type Iq = Int
type Language = String 
data DataSubject = DS {name :: Name, age :: Age, iq :: Iq, language :: Language} deriving (Show)
data Contain = Name String | Age Int | Iq Int | Language String deriving (Show) --Use so list can take multiple types

profile1 = [Name "Bob", Age 22, Iq 100, Language "French"]

makeDS :: [Contain] -> DataSubject
makeDS t = DS …
Run Code Online (Sandbox Code Playgroud)

haskell type-conversion

0
推荐指数
1
解决办法
205
查看次数

Haskell - 使用递归的代数数据类型?

我已经按照指南创建了一个使用以下数据类型的二叉搜索树:

data BinarySearchTree a = EmptyTree | TreeNode a (BinarySearchTree a) (BinarySearchTree a) deriving (Show, Read, Eq)
Run Code Online (Sandbox Code Playgroud)

我是否正确地说'TreeNode'正在使用递归,即创建自己数据类型的2个元素'(BinarySearchTree a)(BinarySearchTree a)'?

我从来没有见过像这样的数据类型,任何简短的解释都会很棒!

haskell types recursive-datastructures algebraic-data-types

0
推荐指数
1
解决办法
193
查看次数

根据类型从列表中提取值?

我试图迭代自定义数据类型列表,并确定特定类型的值.在这种情况下,我想要列表中的年龄:

data MyData = Age Int | DOB Int | Name String | Address String

myList = [Age 89, DOB 13, Age 33, Name "Barbra", Address "103 Lane"]

myFunction :: [MyData] -> MyData
myFunction (x : xs) = if x == Age then x : myFunction xs else myFunction xs
Run Code Online (Sandbox Code Playgroud)

错误:

"Age is applied to too few arguments"
Run Code Online (Sandbox Code Playgroud)

什么是最好的解决方案?

haskell types

0
推荐指数
1
解决办法
41
查看次数

有多种类型的Functor声明?

我有以下数据类型:

data Users id height weight = User id height weight

instance Functor Users where
fmap f (User id height weight) = User(f id height weight)
Run Code Online (Sandbox Code Playgroud)

然而这不会编译?

当我使用具有单个参数的类型时,它工作正常,例如:

data Users id = User id
instance Functor Users where
fmap f (User id) = User (f id)
Run Code Online (Sandbox Code Playgroud)

为什么我的第一个例子不起作用?

haskell functor

0
推荐指数
1
解决办法
607
查看次数

通过大于矢量大小的值旋转矢量元素?

有点简单的问题,我使用std :: rotate在向量中旋转元素的顺序:

std::vector<int> V {1,2,3,4};
std::rotate(V.rbegin(), V.rbegin() + K, V.rend());

//output: {4,1,2,3}
Run Code Online (Sandbox Code Playgroud)

我得到一个分段错误,其中K> = V.size(),我很难理解:1)为什么会出现这个错误?2)如何用这样的K值进行旋转操作?

例如,K为6应输出{2,3,4,1}

c++ stl rotation

0
推荐指数
1
解决办法
51
查看次数